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

为什么这不返回<div id="articlebody"> ... </div>标签和中间的东西?它什么也不返回。我知道它的存在是因为我正盯着它看

soup.prettify()

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

编辑:我发现 BeautifulSoup 没有正确解析我的页面,这可能意味着我试图解析的页面没有正确格式化为 SGML 或其他格式)

4

13 回答 13

267

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

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

<div>在s 中查找s<div>也可以:

>>> soup = BeautifulSoup.BeautifulSoup('<html><body><div><div id="articlebody"> ... </div></div></body></html')
>>> soup.find("div", {"id": "articlebody"})
<div id="articlebody"> ... </div>
于 2010-01-25T22:55:30.580 回答
105

通过它的元素找到一个元素id

div = soup.find(id="articlebody")
于 2014-03-14T16:17:10.383 回答
37

Beautiful Soup 4 通过 method 支持大多数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")
于 2017-02-20T05:42:51.290 回答
16

我认为当“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)
于 2010-03-04T03:34:24.337 回答
9

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

于 2013-01-29T16:20:48.400 回答
8

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

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

我认为您需要做的是指定您想要的属性,例如

source.find('div', attrs={'id':'articlebody'})
于 2010-01-25T23:05:25.333 回答
5

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

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

于 2010-01-25T23:00:55.007 回答
5

我用了:

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

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

于 2010-01-25T23:02:37.903 回答
4

这是一个代码片段

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

如您所见,我找到了所有标签,然后找到了所有带有 class="article" 的标签

于 2010-01-25T23:03:03.233 回答
4

在尝试抓取 Google 时也发生在我身上。
我最终使用了 pyquery。
安装:

pip install pyquery

采用:

from pyquery import PyQuery    
pq = PyQuery('<html><body><div id="articlebody"> ... </div></body></html')
tag = pq('div#articlebody')
于 2015-04-30T05:34:56.693 回答
2

Id属性始终是唯一标识的。这意味着您可以直接使用它,甚至无需指定元素。因此,如果您的元素可以解析内容,那将是一个加分项。

divEle = soup.find(id = "articlebody")
于 2020-05-11T10:40:59.653 回答
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"})
于 2020-08-23T06:34:50.107 回答
-2
soup.find("tagName",attrs={ "id" : "articlebody" })
于 2020-10-31T11:03:51.780 回答