2016-04-22 5 views
0

Где ошибка? Я хочу проанализировать текст без тегов.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' 
+0

вы заменили ' soup' с результирующим набором: 'soup = soup.find_all ('div', class _ =" text-decor article__contain ")'. Resulset - это просто список с дополнительной ссылкой на исходный объект супа. Мне непонятно, почему вы заменяете объект BeautifulSoup на набор результатов, если вы хотите выполнить вложенный поиск с помощью [селектора CSS] (https://www.crummy.com/software/BeautifulSoup/bs4/) doc/# css-selectors). –

+0

Вы действительно хотите посмотреть [форматирование вывода] (https://www.crummy.com/software/BeautifulSoup/bs4/doc/#output), не сопоставляйте объекты со строками. –

ответ

0

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

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

AttributeError: 'ResultSet' object has no attribute 'foo' - This usually happens because you expected find_all() to return a single tag or string. But find_all() returns a list of tags and strings–a ResultSet object. You need to iterate over the list and look at the .foo of each one. Or, if you really only want one result, you need to use find() instead of 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