0

我正在使用html5lib验证来自用户的自定义 HTML 。问题是 html5lib 添加了html,headbody标签,我不需要。

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使用。

4

3 回答 3

3

似乎我们可以使用 s 的hidden属性Tag来防止标签本身在将标签/汤转换为字符串/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>这有效:

>>> soup.body.hidden=True
>>> print soup.body.prettify()
 <div>
  <footer>
   <h3>
    foot
   </h3>
  </footer>
 </div>
 <div>
  foo
 </div>

我通过 BeautifulSoup 源代码发现了这一点。调用后soup = BeautifulSoup(html),根标签的内部名称为“[document]”。默认情况下,只有根标签有hidden==True. 这可以防止其名称出现在任何 HTML 输出中。

于 2013-05-17T17:23:32.567 回答
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()

这有点骇人听闻,但不如replace().

于 2012-04-30T13:06:36.840 回答
1

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

于 2012-04-30T14:35:26.170 回答