Прекрасний суп і видобуток діва та його вмісту за ідентифікатором


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

Чому це НЕ повертає <div id="articlebody"> ... </div>теги та речі між ними? Він нічого не повертає. І я знаю, адже він існує, тому що я дивлюся прямо на це

soup.prettify()

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

( EDIT: я виявив, що BeautifulSoup неправильно розбирав мою сторінку, що, ймовірно, означало, що сторінка, яку я намагався проаналізувати, неправильно відформатована у SGML чи будь-якому іншому)


(Для вашого редагування це питання все ще має значення як багаторазовий ресурс для інших, навіть якщо аналізатор не працює на вашій конкретній сторінці)
smci

Відповіді:


202

Ви повинні опублікувати свій приклад документа, тому що код працює добре:

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

2
мій приклад документа величезний. Я відслідковую цю проблему - я думаю, що це не працює над дівами дивів. Я зробив підрахунок, скільки дівок міститься в документі з друком len (суп ('div')), який призвів до 10, і я можу ЧИСТО бачити більше 10 дівів з firebug. тому я думаю, що він просто не може знайти діви всередині divs, тому мені потрібно звузити речі обгорткою.
Тоні Старк

8
Ну, тоді відповісти на ваше питання неможливо, кришталеві кульки - це не надійний спосіб налагодження. :)
Лукаш Лалінськ

1
Я спробував цей код. div має <embed>, і я не можу надрукувати вбудовування всередині нього.
Вінсент

13
або простіше кажучиdiv = soup.find(id="articlebody")
jfs

4
абоsoup.find('div', id='articlebody')
Тревор Бойд Сміт

71

Щоб знайти елемент за його допомогою id:

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

15

Гарний суп 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")

13

Я думаю, що існує проблема, коли теги 'div' занадто багато вкладені. Я намагаюся проаналізувати деякі контакти з html-файлу facebook, і Beautifulsoup не в змозі знайти теги "div" з класом "fcontent".

Це трапляється і з іншими класами. Коли я шукаю діви взагалі, то виявляються лише ті, які не так багато вкладені.

Вихідним кодом 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

Найімовірніше, через те, що у парсера Beautifulsoup аналізатор має проблеми. Змініть інший аналізатор, наприклад "lxml" і повторіть спробу.


Це працювало для мене, дякую! Я використавsoup = BeautifulSoup(data, parser="html.parser")
харт-харт

8

У джерелі Beautifulsoup цей рядок дозволяє вводити диви в divs; тож ваше занепокоєння у коментарі lukas було б неправдивим.

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

Я думаю, що вам потрібно зробити, - це вказати потрібні вам форми

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

5

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

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


4

Я використав:

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

Як мій синтаксис для find / findall; що, якщо між тегом та списком атрибутів немає інших необов'язкових параметрів, це не повинно відрізнятися.


4

Зі мною траплялося також під час спроби вискрити Google.
Я в кінцевому рахунку використовував pyquery.
Встановити:

pip install pyquery

Використання:

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

3

Ось фрагмент коду

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

Як ви бачите, я знаходжу всі теги, а потім я знаходжу всі теги з class = "article" всередині


0

IdВластивість завжди однозначно визначені. Це означає, що ви можете використовувати його безпосередньо, навіть не вказуючи елемент. Тому це плюс, якщо ваші елементи мають проаналізувати вміст.

divEle = soup.find(id = "articlebody")
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.