Вопрос-Ответ

Beautiful Soup: 'ResultSet' object has no attribute 'find_all'?

Красивый суп: у объекта 'ResultSet' нет атрибута 'find_all'?

Я пытаюсь создать простую таблицу с помощью Beautiful Soup. Вот мой код:

import requests
from bs4 import BeautifulSoup

url = 'https://gist.githubusercontent.com/anonymous/c8eedd8bf41098a8940b/raw/c7e01a76d753f6e8700b54821e26ee5dde3199ab/gistfile1.txt'
r = requests.get(url)

soup = BeautifulSoup(r.text)
table = soup.find_all(class_='dataframe')

first_name = []
last_name = []
age = []
preTestScore = []
postTestScore = []

for row in table.find_all('tr'):
col = table.find_all('td')

column_1 = col[0].string.strip()
first_name.append(column_1)

column_2 = col[1].string.strip()
last_name.append(column_2)

column_3 = col[2].string.strip()
age.append(column_3)

column_4 = col[3].string.strip()
preTestScore.append(column_4)

column_5 = col[4].string.strip()
postTestScore.append(column_5)

columns = {'first_name': first_name, 'last_name': last_name, 'age': age, 'preTestScore': preTestScore, 'postTestScore': postTestScore}
df = pd.DataFrame(columns)
df

Однако всякий раз, когда я запускаю его, я получаю эту ошибку:

---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-116-a900c2872793> in <module>()
14 postTestScore = []
15
---> 16 for row in table.find_all('tr'):
17 col = table.find_all('td')
18

AttributeError: 'ResultSet' object has no attribute 'find_all'

Я прочитал около дюжины вопросов StackOverflow об этой ошибке, и я не могу понять, что я делаю не так.

Переведено автоматически
Ответ 1

table Переменная содержит список. Вам нужно будет вызвать find_all для его элементов (даже если вы знаете, что это список только с одним элементом), а не для всего объекта.

>>> type(table)
<class 'bs4.element.ResultSet'>
>>> type(table[0])
<class 'bs4.element.Tag'>
>>> len(table[0].find_all('tr'))
6
>>>
Ответ 2

table = soup.find_all(class_='dataframe')

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

table = soup.find(class_='dataframe')

Однако это еще не все:

for row in table.find_all('tr'):
col = table.find_all('td')

Вы, вероятно, захотите выполнить итерацию по tds в строке здесь, а не по всей таблице. (В противном случае вы будете просто видеть первую строку снова и снова.)

for row in table.find_all('tr'):
for col in row.find_all('td'):
Ответ 3

Перебираем таблицу и используем rowfind_all('td')

   for row in table:
col = row.find_all('td')
python beautifulsoup