BeautifulSoup — ошибка атрибута при использовании find_all для нескольких таблиц

#python #python-3.x #beautifulsoup

#python #python-3.x #beautifulsoup

Вопрос:

Я пытаюсь создать веб-скребок (код ниже), но я всегда получаю эту ошибку:

 Traceback (most recent call last):
  File "wikipedia.py", line 11, in <module>
    for table in match.find_all('table'):
  File "/Users/claycrosby/opt/anaconda3/lib/python3.8/site-packages/bs4/element.py", line 2160, in __getattr__
    raise AttributeError(
AttributeError: ResultSet object has no attribute 'find_all'. You're probably treating a list of elements like a single element. Did you call find_all() when you meant to call find()?
  

Я пробовал поменять find find_all местами в соответствии с сообщением, но это не меняет возвращаемую ошибку. Кроме того, существует несколько table вложенных vevent summary таблиц, которые я изначально нахожу

Я пробовал несколько итераций перехода непосредственно из сводки событий в tr и получаю ту же ошибку

HTML

 import requests
from bs4 import BeautifulSoup

url = 'https://en.wikipedia.org/wiki/2020–21_Top_14_season'
response = requests.get(url)
html = response.content

soup = BeautifulSoup(html, 'html.parser')
match = soup.find_all('.vevent summary')

#for table in match.find_all('table'):
for data in match.find_all('tbody'):
    for row in data.find('tr'):
        for cell in row.find('td'):
            print (cell.text.replace('amp;nbsp;', ''))
  

Ответ №1:

В Beautiful Soup используйте find_all("div", {"class": "vevent"}) для поиска по имени класса. Ошибка ссылалась на match то, что возвращает список.

Попробуйте этот код:

 import requests
from bs4 import BeautifulSoup

url = 'https://en.wikipedia.org/wiki/2020–21_Top_14_season'
response = requests.get(url)
html = response.content

soup = BeautifulSoup(html, 'html.parser')
match = soup.find_all("div", {"class": "vevent"})  # returns list

print('matches',len(match))

for m in match:
  for table in m.find_all('table'):
      for data in table.find_all('tbody'):
          for row in data.find_all('tr'):
              for cell in row.find_all('td'):
                  print (cell.text.replace('amp;nbsp;', ''))
  

Комментарии:

1. Спасибо! Это было очень полезно, решило мою проблему. Спасибо, что ответили на вопрос в стиле новичка

Ответ №2:

Вы можете попробовать это:

 from bs4 import BeautifulSoup
import urllib.request
import bs4 as bs

url_1 = 'https://en.wikipedia.org/wiki/2020–21_Top_14_season'
sauce_1  = urllib.request.urlopen(url_1).read()
soup_1 = bs.BeautifulSoup(sauce_1, 'lxml')

for table in soup_1.find_all('table'):
    print(table.text)