html5lib。如何在不添加html,head和body标签的情况下获得有效的html?

时间:2012-04-30 12:37:37

标签: python dom html-parsing html5lib

我正在验证来自 html5lib 的用户的自定义HTML。问题是html5lib添加了htmlheadbody标记,我不需要这些标记。

parser = html5lib.HTMLParser(tree=treebuilders.getTreeBuilder("simpleTree"))
f = open('/home/user/ex.html')
doc = parser.parse(f)
doc.toxml()
'<html><head/><body><div>\n  <a href="http://speedhunters.com">speedhunters.com\n</a></div><a href="http://speedhunters.com">\n</a></body></html>'

这已经过验证,可以进行清理,但是如何删除或阻止将这些标记添加到树中? 我的意思是使用。{/ p>排除replace

3 个答案:

答案 0 :(得分:2)

似乎我们可以使用hidden的{​​{1}}属性来防止在将标记/汤转换为字符串/ unicode时标记本身被“导出”:

Tag

基本上,提问者的目标是在没有>>> from bs4 import BeautifulSoup >>> html = u"<div><footer><h3>foot</h3></footer></div><div>foo</div>" >>> soup = BeautifulSoup(html, "html5lib") >>> print soup.body.prettify() <body> <div> <footer> <h3> foot </h3> </footer> </div> <div> foo </div> </body> 包装器的情况下获取body标签的全部内容。这有效:

<body>

我通过浏览BeautifulSoup来找到了这个。调用>>> soup.body.hidden=True >>> print soup.body.prettify() <div> <footer> <h3> foot </h3> </footer> </div> <div> foo </div> 后,根标签的内部名称为“[document]”。默认情况下,只有根标记具有soup = BeautifulSoup(html)。这可以防止其名称以任何HTML输出结束。

答案 1 :(得分:1)

哇,html5lib有可怕的文档。

查看源代码并开发快速测试用例,这似乎有效:

import html5lib
from html5lib import treebuilders
parser = html5lib.HTMLParser(tree=treebuilders.getTreeBuilder("simpleTree"))
with open('test.html') as test:
    doc = parser.parse(test)
    for child in doc:
        if child.parent.name == "body":
            return child.toxml()

有点hackish,但不如replace()

答案 2 :(得分:1)

如果您正在处理“不常见”的HTML,

lxml可能是更好的选择。