首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用漂亮的汤正确解析空html标记

使用漂亮的汤正确解析空html标记
EN

Stack Overflow用户
提问于 2017-03-24 14:28:22
回答 2查看 427关注 0票数 1

HTML有一个空元素的概念,如MDN所列。然而,漂亮的汤似乎不能很好地处理它们:

代码语言:javascript
运行
复制
import bs4

soup = bs4.BeautifulSoup(
    '<div><input name=the-input><label for=the-input>My label</label></div>',
    'html.parser'
)
print(soup.contents)

我得到:

代码语言:javascript
运行
复制
[<div><input name="the-input"><label for="the-input">My label</label></input></div>]

也就是说,输入已经包装了标签。

问题:有什么方法可以得到漂亮的汤来正确地解析这个吗?或者我还没有找到对这种行为的官方解释?

至少我希望这样的事情:

代码语言:javascript
运行
复制
[<div><input name="the-input"></input><label for="the-input">My label</label></div>]

即,输入在标签之前自动关闭。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-03-24 14:56:37

正如他们的文档中所述,html5lib像web浏览器一样解析文档(就像本例中的lxml)。它将尝试通过在需要时添加/关闭标记来修复文档树。

在您的示例中,我使用了lxml作为解析器,它给出了以下结果:

代码语言:javascript
运行
复制
soup = bs4.BeautifulSoup(
'<div><input name=the-input><label for=the-input>My label</label></div>',
'lxml'
)
print(soup.body.contents)

[<div><input name="the-input"/><label for="the-input">My label</label></div>]

注意,lxml添加了html & body标记,因为它们不在源代码中,所以我打印了body内容。

票数 3
EN

Stack Overflow用户

发布于 2017-03-24 14:45:08

我想说的是,“汤”正在尽它所能来修复这个html结构,在某些情况下,它实际上是有帮助的。

无论如何,对于您的情况,我会说使用lxml,它将根据您的需要解析html结构,或者尝试使用parsel

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43002091

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档