【问题标题】:html5lib. How to get valid html without adding html, head and body tags?html5lib。如何在不添加 html、head 和 body 标签的情况下获取有效的 html?
【发布时间】:2012-04-30 12:37:36
【问题描述】:

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

【问题讨论】:

  • 所以,我想要一只猫,但我不需要它有腿......
  • 这是页面的一部分,用户可以自定义,所以我只需要一条好猫的尾巴。
  • 很公平,这是一个合理的用例。只是检查你没有试图产生一些可怕的错误输出。
  • @Lattyware,你觉得如何解决这个问题?

标签: python dom html-parsing html5lib


【解决方案1】:

看来我们可以使用Tags 的hidden 属性来防止标签本身在将标签/汤转换为字符串/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>

本质上,提问者的目标是在没有&lt;body&gt; 包装器本身的情况下获取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 输出中。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-09-12
        • 2019-04-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多