Красивый суп и извлечение div и его содержимого по ID - PullRequest
122 голосов
/ 26 января 2010
soup.find("tagName", { "id" : "articlebody" })

Почему это НЕ возвращает теги <div id="articlebody"> ... </div> и прочее между ними? Ничего не возвращает И я точно знаю, что он существует, потому что я смотрю прямо на него с

soup.prettify()

soup.find("div", { "id" : "articlebody" }) также не работает.

Редактировать: Нет ответа на этот пост - как его удалить? Я обнаружил, что BeautifulSoup неправильно анализирует, что, вероятно, означает, что страница, которую я пытаюсь проанализировать, не отформатирована должным образом в SGML или чем-то еще.

Ответы [ 10 ]

170 голосов
/ 26 января 2010

Вы должны опубликовать свой пример документа, потому что код работает нормально:

>>> import BeautifulSoup
>>> soup = BeautifulSoup.BeautifulSoup('<html><body><div id="articlebody"> ... </div></body></html')
>>> soup.find("div", {"id": "articlebody"})
<div id="articlebody"> ... </div>

Нахождение <div> с внутри <div> с также работает:

>>> soup = BeautifulSoup.BeautifulSoup('<html><body><div><div id="articlebody"> ... </div></div></body></html')
>>> soup.find("div", {"id": "articlebody"})
<div id="articlebody"> ... </div>
57 голосов
/ 14 марта 2014

Чтобы найти элемент по id:

div = soup.find(id="articlebody")
13 голосов
/ 20 февраля 2017

Beautiful Soup 4 поддерживает большинство CSS-селекторов с .select() методом , поэтому вы можете использовать id селектор , например:

soup.select('#articlebody')

Если вам нужно указать тип элемента, вы можете добавить селектор типа перед селектором id:

soup.select('div#articlebody')

Метод .select() вернет методнабор элементов, что означает, что он будет возвращать те же результаты, что и следующий .find_all() метод пример:

soup.find_all('div', id="articlebody")
# or
soup.find_all(id="articlebody")

Если вы хотите выбрать только один элемент, то выможно просто использовать .find() метод :

soup.find('div', id="articlebody")
# or
soup.find(id="articlebody")
11 голосов
/ 04 марта 2010

Я думаю, что есть проблема, когда теги 'div' слишком сильно вложены. Я пытаюсь проанализировать некоторые контакты из HTML-файла facebook, и Beautifulsoup не может найти теги "div" с классом "fcontent".

Это происходит и с другими классами. Когда я ищу div в общем, получаются только те, которые не так много вложены.

Исходным кодом html может быть любая страница из facebook в списке друзей вашего друга (не одного из ваших друзей). Если кто-то может это проверить и дать совет, я был бы очень признателен.

Это мой код, где я просто пытаюсь напечатать количество тегов "div" с классом "fcontent":

from BeautifulSoup import BeautifulSoup 
f = open('/Users/myUserName/Desktop/contacts.html')
soup = BeautifulSoup(f) 
list = soup.findAll('div', attrs={'class':'fcontent'})
print len(list)
9 голосов
/ 29 января 2013

Скорее всего, из-за проблем с парсером Beautifulsoup по умолчанию. Измените другой синтаксический анализатор, например 'lxml', и повторите попытку.

8 голосов
/ 26 января 2010

В источнике Beautifulsoup эта строка позволяет div быть вложенными в div; так что ваше беспокойство в комментарии Лукаса не будет действительным.

NESTABLE_BLOCK_TAGS = ['blockquote', 'div', 'fieldset', 'ins', 'del']

Я думаю, что вам нужно указать атрибуты, которые вы хотите, например

source.find('div', attrs={'id':'articlebody'})
5 голосов
/ 26 января 2010

вы пробовали soup.findAll("div", {"id": "articlebody"})?

звучит безумно, но если вы собираете вещи с дикой природы, вы не можете исключить несколько делений ...

4 голосов
/ 30 апреля 2015

Случилось и со мной, когда я пытался очистить Google.
Я закончил с использованием pyquery.
Установка:

pip install pyquery

Использование:

from pyquery import PyQuery    
pq = PyQuery('<html><body><div id="articlebody"> ... </div></body></html')
tag = pq('div#articlebody')
4 голосов
/ 26 января 2010

Я использовал:

soup.findAll('tag', attrs={'attrname':"attrvalue"})

как мой синтаксис для find / findall; тем не менее, если между тегом и списком атрибутов нет других необязательных параметров, они не должны отличаться.

3 голосов
/ 26 января 2010

Вот фрагмент кода

soup = BeautifulSoup(:"index.html")
titleList = soup.findAll('title')
divList = soup.findAll('div', attrs={ "class" : "article story"})

Как видите, я нахожу все теги, а затем нахожу все теги с class = "article" внутри

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...