AttributeError: у объекта 'ResultSet' нет атрибута 'find_all'

Где ошибка? Я хочу разобрать мой текст без тегов.

from bs4 import BeautifulSoup       
import re
import urllib.request
f = urllib.request.urlopen("http://www.championat.com/football/news-2442480-orlov-zenit-obespokoen---pole-na-novom-stadione-mozhet-byt-nekachestvennym.html")

soup = BeautifulSoup(f, 'html.parser')

soup=soup.find_all('div', class_="text-decor article__contain")

invalid_tags = ['b', 'i', 'u', 'br', 'a']

for tag in invalid_tags: 

  for match in soup.find_all(tag):

        match.replaceWithChildren()

soup = ''.join(map(str, soup.contents))

print (soup)

Ошибка:

Traceback (most recent call last):
  File "1.py", line 9, in <module>
    for match in soup.find_all(tag):
AttributeError: 'ResultSet' object has no attribute 'find_all'

1 ответ

Решение

soup=soup.find_all('div', class_="text-decor article__contain")

На этой линии soup становится ResultSet экземпляр - в основном список Tag экземпляры. И вы получаете 'ResultSet' object has no attribute 'find_all' с этого ResultSet Экземпляр не имеет find_all() метод. К вашему сведению, эта проблема на самом деле описана в разделе устранения неполадок в документации:

AttributeError: 'ResultSet' object has no attribute 'foo' - Обычно это происходит потому, что вы ожидали find_all() вернуть один тег или строку. Но find_all() возвращает список тегов и строк - объект ResultSet. Вам нужно перебрать список и посмотреть.foo каждого из них. Или, если вы действительно хотите только один результат, вам нужно использовать find() вместо find_all(),

И вы действительно хотите получить один результат, поскольку на странице есть одна статья:

soup = soup.find('div', class_="text-decor article__contain")

Обратите внимание, что нет необходимости искать теги один за другим, вы можете передать список имен тегов непосредственно find_all() - BeautifulSoup достаточно гибок в расположении элементов:

article = soup.find('div', class_="text-decor article__contain")

invalid_tags = ['b', 'i', 'u', 'br', 'a']
for match in article.find_all(invalid_tags):
     match.unwrap()  # bs4 alternative for replaceWithChildren
Другие вопросы по тегам