Beautiful Soup 并通过 ID 提取一个 div 及其内容

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

为什么这不返回 <div id="articlebody"> ... </div>标签和之间的东西?没有回报。我知道它是存在的,因为我正从

soup.prettify()

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

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

461426 次浏览

你应该发布你的示例文档,因为代码运行良好:

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

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

听起来很疯狂,但如果你从野外采集东西,你不能排除多次潜水的可能性……

我使用:

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

就像我的find/findall语法一样;也就是说,除非在标签和属性列表之间有其他可选参数,否则不应该有什么不同。

下面是一个代码片段

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

正如你所看到的,我找到了所有的标签,然后我找到了所有的标签class="article"在里面

在beautifulsoup源代码中,这一行允许在div中嵌套div;所以你对卢卡斯评论的担心是没有根据的。

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

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

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

我认为'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)

很可能是因为默认的beautifulsoup解析器有问题。换一个不同的解析器,比如'lxml',然后再试一次。

通过id查找元素:

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

当我试图刮谷歌时也发生了 我最终使用pyquery.
安装:< / p >

pip install pyquery

使用:

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

Beautiful Soup 4通过.select()方法支持大多数CSS选择器,因此你可以使用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")

Id属性总是唯一标识的。这意味着您甚至不需要指定元素就可以直接使用它。因此,如果您的元素有它来解析内容,这是一个加分项。

divEle = soup.find(id = "articlebody")
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"})
soup.find("tagName",attrs={ "id" : "articlebody" })