it-roy-ru.com

Красивый суп и извлечение div и его содержимого по ID

soup.find("tagName", { "id" : "articlebody" })

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

soup.prettify()

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

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

121
Tony Stark

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

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

Поиск <div>s внутри <div>s также работает:

>>> soup = BeautifulSoup.BeautifulSoup('<html><body><div><div id="articlebody"> ... </div></div></body></html')
>>> soup.find("div", {"id": "articlebody"})
<div id="articlebody"> ... </div>
168
Lukáš Lalinský

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

div = soup.find(id="articlebody")
56
jfs

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

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")
12
Josh Crozier

Я думаю, что есть проблема, когда теги '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)
11
omar

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

9
liang

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

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

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

source.find('div', attrs={'id':'articlebody'})
8
dagoof

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

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

5
user106514

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

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

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

4
user257111

Случилось и у меня тоже при попытке поцарапать гугл.
Я закончил с помощью пикери.
[. .____] Установка:

pip install pyquery

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

from pyquery import PyQuery    
pq = PyQuery('<html><body><div id="articlebody"> ... </div></body></html')
tag = pq('div#articlebody')
4
Shoham

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

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

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

3
Recursion