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


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

为什么这不返回<div id="articlebody"> ... </div>标签和中间的东西?它什么也不返回。我知道一个事实,因为我正盯着它

soup.prettify()

soup.find("div", { "id" : "articlebody" }) 也行不通。

编辑:我发现BeautifulSoup无法正确解析我的页面,这可能意味着我尝试解析的页面在SGML或其他格式中未正确格式化)


(对您的EDIT来说,即使解析器无法在您的特定页面上使用,此问题对于其他人也仍然具有可重用的价值)
smci

Answers:


202

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

>>> 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中查找s 也可以:

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

2
我的示例文档非常庞大。我正在跟踪问题-我认为这不适用于div的div。我用print len(soup('div'))计算了文档中有多少个div,结果是10,而使用萤火虫我可以清楚地看到超过10个div。所以我认为它在div内找不到div,所以我需要逐个包装地缩小范围。
托尼·史塔克

8
好吧,那么这不可能回答您的问题,水晶球不是可靠的调试方法。:)
卢卡斯·拉林斯基

1
我尝试了这段代码。div已经<embed>并且我无法打印嵌入其中的内容。
文森特


4
soup.find('div', id='articlebody')
Trevor Boyd Smith,

71

通过其元素查找id

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

15

Beautiful Soup 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'标签嵌套过多时会出现问题。我正在尝试从Facebook html文件中解析一些联系人,Beautifulsoup无法找到带有“ fcontent”类的标签“ div”。

其他类也会发生这种情况。一般而言,当我搜索div时,它只会变成那些嵌套不多的div。

html源代码可以是您的朋友(而不是您的朋友之一)的朋友列表中来自facebook的任何页面。如果有人可以测试它并提供一些建议,我将非常感激。

这是我的代码,在这里我只尝试打印带有“ 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)

9

很可能是因为默认的beautifulsoup解析器有问题。更改其他解析器,例如“ lxml”,然后重试。


这对我有用,谢谢!我曾经用过soup = BeautifulSoup(data, parser="html.parser")
will-hart 2014年

8

在beautifulsoup源代码中,此行允许div嵌套在div中;因此您对lukas评论的关注不会成立。

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

我认为您需要做的是指定所需的attrs,例如

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

5

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

听起来很疯狂,但是如果您从野外抓东西,就不能排除多个div ...


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")
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.