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

2024-04-25 03:35:49 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用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>'

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


Tags: 用户标记divcomhttpparserdochtml
3条回答

哇,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()

它有点老套,但比replace()要小。在

如果您正在处理“不常见”的html,lxml可能是一个更好的选择。在

似乎我们可以使用Tags的hidden属性,以防止在将标记/soup转换为string/unicode时标记本身被“导出”:

>>> 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>包装本身。这是有效的:

^{pr2}$

我是通过BeautifulSoup的资料找到的。在调用soup = BeautifulSoup(html)之后,根标记的内部名称为“[document]”。默认情况下,只有根标记有hidden==True。这可以防止其名称在任何HTML输出中结束。在

相关问题 更多 >