Проблема со списком при извлечении данных со страницы XML в Twitter - PullRequest
1 голос
/ 19 июля 2011

С моей функцией я могу извлекать имена пользователей со страницы поиска в xml в Твиттере для приложения поиска друзей, которое я создаю как проект. Проблема, однако, в том, что когда я беру имена пользователей и вводю их в список, происходит нечто странное. Вместо того, чтобы каждое имя пользователя было отдельным элементом в списке, у меня каждое имя пользователя было отдельным списком.

Так что я вместо этого получаю около 20 списков. Вот пример того, что производит мой код list = ["twitter.com/username"], ["twitter.com/username1"],["twitter.com/username2"]

Итак, вы видите, что каждое имя пользователя имеет свой собственный список. Вместо одного списка с тремя значениями у меня есть три списка с одним значением в каждом. Это абсолютный кошмар, чтобы повторить. Как я могу сделать так, чтобы у меня был один список с тремя элементами?

Код здесь:

def get_names(search_term = raw_input("What term do you want to search for?")):
    search_page = "http://search.twitter.com/search.atom?q="
    search_page += search_term
    data = []
    doc = urllib.urlopen(search_page).read()
    soup = BeautifulStoneSoup(''.join(doc))
    data = soup.findAll("uri")
    for uri in soup.findAll('uri'):
        data = []
        uri = str(uri.extract())
        data.append(uri[5:-6] 
        print data

Ответы [ 2 ]

1 голос
/ 19 июля 2011

Вы создаете новый список, называемый данными, для каждого URI.Если вы переместите строку data = [] из цикла for uri in soup.findAll('uri'):, у вас должен получиться один список вместо списка списков.

Кроме того, у вас есть другие проблемы.В следующей рядом с последней строкой есть синтаксическая ошибка: в конце строки отсутствует закрывающая скобка.У вас есть повторяющиеся строки.Попробуйте удалить первую строку data = [], а также строку data = soup.findAll('url'), так как вы просто снова выполняете findAll для цикла for.Кроме того, вы не должны помещать raw_input в сигнатуру функции, потому что это означает, что она вызывается при определении функции, а не при ее вызове.

Попробуйте:

def get_names():
    search_page = "http://search.twitter.com/search.atom?q="
    search_page += raw_input("What term do you want to search for?")
    doc = urllib.urlopen(search_page).read()
    soup = BeautifulStoneSoup(doc)
    doc.close()
    data = [str(uri.extract())[5:-6] for uri in soup.findall('uri')]
    return data
names = get_names()
print(names)

Редактировать: Вам также не нужно ''.join(doc), read() возвращает одну строку, а не последовательность;data может быть собран с пониманием строки.

0 голосов
/ 19 июля 2011

Проблема в том, что вы как бы повсюду в своих назначениях на данные; Я бы предложил изменить этот код на:

def get_names(search_term = raw_input("What term do you want to search for?")):
    search_page = "http://search.twitter.com/search.atom?q="
    search_page += search_term
    data = []
    doc = urllib.urlopen(search_page).read()
    soup = BeautifulStoneSoup(''.join(doc))
    for uri in soup.findAll('uri'):
        uri = str(uri.extract())
        data.append(uri[5:-6])
    print data
    return data

(не проверено, поскольку я не знаю, на что ссылается BeautifulStoneSoup)

НТН

Pacific

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...