Почему я получаю «ResultSet» не имеет атрибута «findAll» с использованием BeautifulSoup в Python? - PullRequest
8 голосов
/ 14 июня 2009

Итак, я медленно изучаю Python и пытаюсь создать простую функцию, которая будет извлекать данные со страницы рекордов онлайн-игры. Это чужой код, который я переписал в одну функцию (что может быть проблемой), но я получаю эту ошибку. Вот код:

>>> from urllib2 import urlopen
>>> from BeautifulSoup import BeautifulSoup
>>> def create(el):
    source = urlopen(el).read()
    soup = BeautifulSoup(source)
    get_table = soup.find('table', {'id':'mini_player'})
    get_rows = get_table.findAll('tr')
    text = ''.join(get_rows.findAll(text=True))
    data = text.strip()
    return data

>>> create('http://hiscore.runescape.com/hiscorepersonal.ws?user1=bigdrizzle13')

Traceback (most recent call last):
  File "<pyshell#18>", line 1, in <module>
    create('http://hiscore.runescape.com/hiscorepersonal.ws?user1=bigdrizzle13')
  File "<pyshell#17>", line 6, in create
    text = ''.join(get_rows.findAll(text=True))
AttributeError: 'ResultSet' object has no attribute 'findAll'

Заранее спасибо.

1 Ответ

19 голосов
/ 14 июня 2009

Ничего себе. Триптих дал отличный ответ на связанный вопрос.

Мы видим, из исходного кода BeautifulSoup , что ResultSet подклассы list.

В вашем примере get_rows является экземпляром класса ResultSet BS,
и поскольку BS ResultSet подклассы list, это означает, что get_rows является списком .

get_rows, например, ResultSet, не имеет реализованный метод findAll; отсюда твоя ошибка.
Триптих сделал по-другому: итерацию по этому списку
Метод Триптиха работает, потому что элементы в списке get_rows являются экземплярами класса Tag в BS; который имеет метод findAll.

Итак, чтобы исправить свой код, вы можете заменить последние три строки вашего create метода на что-то вроде этого:

for row in get_rows:
    text = ''.join(row.findAll(text=True))
    data = text.strip()
    print data

Примечание для Леонарда Ричардсона: ни в коем случае я не собираюсь унижать качество вашей работы, называя ее BS; -)

...