Красивый суп и извлечение div и его содержимое по ID
soup.find("tagName", { "id" : "articlebody" })
Почему это не возвращает <div id="articlebody"> ... </div> теги и прочее между ними? Он ничего не возвращает. И я точно знаю, что он существует, потому что я смотрю прямо на него из
soup.prettify()
soup.find("div", { "id" : "articlebody" }) тоже не работает.
Edit: нет ответа на этот пост - Как удалить его? Я обнаружил, что BeautifulSoup не разбирает правильно, что, вероятно, на самом деле означает, что страница, которую я пытаюсь разобрать, неправильно отформатирована в SGML или что-то еще.
10 ответов:
вы должны опубликовать свой пример документа, потому что код работает нормально:
>>> import BeautifulSoup >>> soup = BeautifulSoup.BeautifulSoup('<html><body><div id="articlebody"> ... </div></body></html') >>> soup.find("div", {"id": "articlebody"}) <div id="articlebody"> ... </div>найти
<div>внутри<div>s работает также:>>> soup = BeautifulSoup.BeautifulSoup('<html><body><div><div id="articlebody"> ... </div></div></body></html') >>> soup.find("div", {"id": "articlebody"}) <div id="articlebody"> ... </div>
Я думаю, что есть проблема, когда теги' div ' слишком много вложенных. Я пытаюсь разобрать некоторые контакты из html-файла 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)
скорее всего, из-за по умолчанию beautifulsoup парсер имеет проблемы. Измените другой парсер, например "lxml", и повторите попытку.
красивый суп 4 поддерживает большинство селекторы CSS С
.select()метод, поэтому вы можете использоватьidселектор, например:soup.select('#articlebody')если нужно указать тип элемента, вы можете добавить выбор типа до
idселектор:soup.select('div#articlebody')The
.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")
в источнике beautifulsoup эта строка позволяет divs быть вложенными в divs; поэтому ваше беспокойство в комментарии Лукаса было бы недействительным.
NESTABLE_BLOCK_TAGS = ['blockquote', 'div', 'fieldset', 'ins', 'del']то, что я думаю, что вам нужно сделать, это указать attrs, которые вы хотите, такие как
source.find('div', attrs={'id':'articlebody'})
ты пробовал
soup.findAll("div", {"id": "articlebody"})?звучит безумно, но если вы соскабливаете материал из дикой природы, вы не можете исключить несколько дивов...
Я:
soup.findAll('tag', attrs={'attrname':"attrvalue"})как мой синтаксис для find / findall; тем не менее, если между тегом и списком атрибутов нет других необязательных параметров, это не должно отличаться.
случилось со мной также при попытке очистить Google.
Я закончил тем, что использовал pyquery.
Установить:pip install pyqueryиспользование:
from pyquery import PyQuery pq = PyQuery('<html><body><div id="articlebody"> ... </div></body></html') tag = pq('div#articlebody')
вот фрагмент кода
soup = BeautifulSoup(:"index.html") titleList = soup.findAll('title') divList = soup.findAll('div', attrs={ "class" : "article story"})Как вы можете видеть, я нахожу все теги, а затем я нахожу все теги с class= "article" внутри
Comments