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

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

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

soup.prettify()

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

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

Ответ 1

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

>>> 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>

Ответ 2

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

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

Ответ 3

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

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

Исходным кодом 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)

Ответ 4

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

Ответ 5

В источнике beautifulsoup эта строка позволяет встраивать divs в div; поэтому ваша обеспокоенность в комментарии lukas не будет действительна.

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

Я думаю, вам нужно указать нужные вам attrs, такие как

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

Ответ 6

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

pip install pyquery

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

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

Ответ 7

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

soup.select('#articlebody')

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

soup.select('div#articlebody')

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

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

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

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

Ответ 8

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

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

Ответ 9

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

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

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

Ответ 10

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

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

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