【问题标题】:Does lxml parse HTML contextually?lxml 是否根据上下文解析 HTML?
【发布时间】:2011-08-25 04:22:27
【问题描述】:

我正在使用lxml 来解析 HTML:

>>> from lxml.html import fromstring, tostring

在某些情况下它会正确解析尾随空格:

>>> html = """<div>some <i>text</i> </div>"""
>>> html == tostring(fromstring(html))
True

但是在遇到未知标签(比如下面的blah标签)的时候好像会断掉。

>>> html = """<div>some <blah>text</blah> </div>"""
>>> html == tostring(fromstring(html))
False

如何修复它以包含所有标签的尾随空格?

【问题讨论】:

    标签: python html xml parsing lxml


    【解决方案1】:

    这似乎是由于 libxml2 的行为(我已从以下版本中删除了一些错误消息):

    >>> print libxml2.htmlParseDoc("""<div>some <blah>text</blah> </div>""", "UTF-8")
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
    <html><body><div>some <blah>text</blah></div></body></html>
    
    
    >>> print libxml2.htmlParseDoc("""<div>some <i>text</i> </div>""", "UTF-8")
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
    <html><body><div>some <i>text</i> </div></body></html>
    

    我仍在寻找解决方法。 libxml2 的 XML 解析器没有表现出这种行为,但我认为它在损坏的 html 上会更糟糕。

    【讨论】:

      【解决方案2】:

      您需要在解析器本身中设置一个标志来删除空格。我在解析 xml 时已经这样做了:

      from lxml import etree
      
      parser = etree.XMLParser(remove_blank_text=True)
      
      data = etree.parse(open(file),parser)
      

      【讨论】:

      • 对不起,但这与 OP 想要的相反:他想保留空白。问题是HTMLParser(可以解析格式错误的html)在&lt;/blah&gt;之后丢弃了空格,可能是因为一些特定于html的清理。
      猜你喜欢
      • 1970-01-01
      • 2012-01-27
      • 1970-01-01
      • 2012-06-10
      • 1970-01-01
      • 1970-01-01
      • 2011-04-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多