我正在验证来自 html5lib 的用户的自定义HTML。问题是html5lib添加了html
,head
和body
标记,我不需要这些标记。
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
答案 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)
查看源代码并开发快速测试用例,这似乎有效:
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)
lxml可能是更好的选择。