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

Ton*_*ark 138 python beautifulsoup

soup.find("tagName", { "id" : "articlebody" })
Run Code Online (Sandbox Code Playgroud)

为什么这不会返回<div id="articlebody"> ... </div>标签和之间的东西?它什么都不返回.而且我知道它存在的事实因为我正盯着它

soup.prettify()
Run Code Online (Sandbox Code Playgroud)

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

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

Luk*_*ský 186

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

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

<div>在内部找到s <div>也可以:

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

  • 或者更简单[`div = soup.find(id ="articlebody")`](http://stackoverflow.com/a/22410466/4279) (12认同)
  • 好吧,那么回答你的问题是不可能的,水晶球不是一种可靠的调试方式.:) (8认同)
  • 或``soup.find('div',id ='articlebody')` (4认同)
  • 我的示例文档非常庞大.我正在追查这个问题 - 我认为这对div的div不起作用.我计算了文件中有多少div与print len(汤('div'))导致10,我可以清楚地看到超过10个div与firebug.所以我认为它只是找不到div内的div,所以我需要通过包装器缩小包装. (2认同)

jfs*_*jfs 62

要通过它找到一个元素id:

div = soup.find(id="articlebody")
Run Code Online (Sandbox Code Playgroud)


Jos*_*ier 14

Beautiful Soup 4支持使用该方法的大多数CSS选择器,因此您可以使用选择器,例如:.select()id

soup.select('#articlebody')
Run Code Online (Sandbox Code Playgroud)

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

soup.select('div#articlebody')
Run Code Online (Sandbox Code Playgroud)

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

soup.find_all('div', id="articlebody")
# or
soup.find_all(id="articlebody")
Run Code Online (Sandbox Code Playgroud)

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

soup.find('div', id="articlebody")
# or
soup.find(id="articlebody")
Run Code Online (Sandbox Code Playgroud)


小智 11

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

其他类也会发生这种情况.当我一般搜索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)
Run Code Online (Sandbox Code Playgroud)


lia*_*ang 9

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


dag*_*oof 8

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

NESTABLE_BLOCK_TAGS = ['blockquote', 'div', 'fieldset', 'ins', 'del']
Run Code Online (Sandbox Code Playgroud)

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

source.find('div', attrs={'id':'articlebody'})
Run Code Online (Sandbox Code Playgroud)


小智 5

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

听起来很疯狂,但如果你从野外刮痧,你不能排除多个div ...


小智 5

我用了:

soup.findAll('tag', attrs={'attrname':"attrvalue"})
Run Code Online (Sandbox Code Playgroud)

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