2016-03-18 3 views
2
from bs4 import BeautifulSoup 
import urllib.request 
import win_unicode_console 
win_unicode_console.enable() 


link = ('https://pietroalbini.io/') 
req = urllib.request.Request(link, headers={'User-Agent': 'Mozilla/5.0'}) 
url = urllib.request.urlopen(req).read() 

soup = BeautifulSoup(url, "html.parser") 
body = soup.find_all('div', {"class":"wrapper"}) 

print(body.text) 

Привет, У меня есть проблема с Beautiful Soup, если я запускаю этот код без «.text» в конце концов, это показать мне список ДИВ, но если Я добавляю «.text» в конце приходит ошибкуКрасивый объект Суп «Resultset» не имеет атрибута «текст»

Traceback (most recent call last): File "script.py", line 15, in print(body.text) AttributeError: 'ResultSet' object has no attribute 'text'

+3

'для DIV в теле: печать (div.text)'. find_all возвращает список элементов, найденных beautifulsoup, соответствующих вашим критериям. Поскольку ошибка говорит, что результирующий набор объектов не имеет текста атрибута, но элементы внутри результирующего набора (если они будут найдены). – Pythonista

+0

@slayer, разве это не достаточно хорошо для ответа? –

ответ

4

find_all возвращает объект ResultSet, который вы можете выполнять итерацию по сравнению с использованием for цикла. Что вы можете сделать, это:

for wrapper in body.find_all('div', {"class":"wrapper"}): 
    print wrapper.text 
+0

Фактически он возвращает объект ResultSet (указанный непосредственно в сообщении об ошибке), который может быть подклассом 'set', но, вероятно, не' list' (возможно, вы имели в виду 'iterable'?) –

+0

Отредактирован ответ. Спасибо за исправление :) – MrPyCharm

1

Вероятно, следовало бы отвечал как ответ .. так, как указано в комментариях почти стенографические

Ваш код должен быть следующим:

for div in body: 
    print div.text 
    #python3 
    #print(div.text) 

Или какой-то именовании схему по вашему желанию.

Метод find_all возвращает сгенерированный список (без использования списка терминов здесь) элементов, найденных beautifulsoup, соответствующих вашим критериям после разбора исходных веб-страниц html рекурсивно или нерекурсивно в зависимости от того, как вы выполняете поиск.

Поскольку ошибка говорит, что результирующий набор объектов не имеет текста атрибута, поскольку он не является элементом, а скорее их набором. Однако элементы внутри результирующего набора (если они будут найдены).

Вы можете просмотреть документацию here

2

Если вы типа:

print(type(body)) 

вы увидите body является <class 'bs4.element.ResultSet'> Это означает все элементы, которые соответствуют классу. Вы можете перебирать их:

for div in body: 
    print(div.text) 

Или, если вы знаете, что есть только DIV, вы можете использовать вместо find:

div = soup.find('div', {"class":"wrapper"}) 
div.text 
Смежные вопросы