美丽的汤,并通过ID提取div及其内容

时间:2010-01-25 22:46:05

标签: python beautifulsoup

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

为什么这不会返回<div id="articlebody"> ... </div>标签之间的内容?它什么都不返回。而且我知道它存在的事实是因为我正从

中盯着它
soup.prettify()

soup.find("div", { "id" : "articlebody" })也不起作用。

编辑:此帖子没有答案 - 如何删除?我发现BeautifulSoup没有正确解析,这可能实际上意味着我试图解析的页面没有在SGML或其他任何方式正确格式化。

13 个答案:

答案 0 :(得分:167)

您应该发布您的示例文档,因为代码工作正常:

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

答案 1 :(得分:56)

id

查找元素
div = soup.find(id="articlebody")

答案 2 :(得分:12)

美丽的汤4支持大多数CSS selectors.select() method,因此您可以使用id selector,例如:

soup.select('#articlebody')

如果您需要指定元素的类型,可以在id选择器之前添加type selector

soup.select('div#articlebody')

.select()方法将返回元素集合,这意味着它将返回与以下.find_all() method示例相同的结果:

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

如果您只想选择一个元素,那么您可以使用.find() method

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

答案 3 :(得分:11)

我认为'div'标签嵌套太多时会出现问题。我试图从facebook html文件解析一些联系人,而Beautifulsoup无法找到带有“fcontent”类的标签“div”。

其他类也会发生这种情况。当我一般搜索div时,它只会转换那些没有嵌套的那些。

html源代码可以是来自朋友列表的朋友列表(不是你的朋友)的任何页面。如果有人可以测试并给出一些建议我会非常感激。

这是我的代码,我只是尝试使用“fcontent”类打印标签“div”的数量:

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 :(得分:9)

最有可能是因为默认的beautifulsoup解析器有问题。更改一个不同的解析器,如'lxml',然后重试。

答案 5 :(得分:8)

在beautifulsoup源中,这一行允许div嵌套在div中;所以你对卢卡斯评论的关注是无效的。

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

我认为你需要做的是指定你想要的attrs,如

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

答案 6 :(得分:5)

你试过soup.findAll("div", {"id": "articlebody"})吗?

听起来很疯狂,但是如果你是在疯狂地抓东西,你就不能排除多个div ......

答案 7 :(得分:4)

我用过:

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

作为我的find / findall语法;也就是说,除非标签和属性列表之间还有其他可选参数,否则不应该有所不同。

答案 8 :(得分:4)

在试图刮刮谷歌时也发生在我身上 我最终使用了pyquery 安装:

pip install pyquery

使用:

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

答案 9 :(得分:3)

这是一个代码片段

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

如您所见,我找到所有标签,然后在

中找到所有带有class =“article”的标签

答案 10 :(得分:0)

Id属性始终是唯一标识的。这意味着您无需指定元素就可以直接使用它。因此,如果您的元素可以在内容中进行解析,则是一个加分点。

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

答案 11 :(得分:0)

from bs4 import BeautifulSoup
from requests_html import HTMLSession

url = 'your_url'
session = HTMLSession()
resp = session.get(url)

# if element with id "articlebody" is dynamic, else need not to render
resp.html.render()

soup = bs(resp.html.html, "lxml")
soup.find("div", {"id": "articlebody"})

答案 12 :(得分:-1)

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