代码之家  ›  专栏  ›  技术社区  ›  Nishant Florentin

lxml.html对两个类似输入的处理方式不同?

  •  3
  • Nishant Florentin  · 技术社区  · 7 年前

    我在使用时看到一些意外的输出 lxml.html .

    import lxml.html as LH
    
    xmlspec = "<?xml version='1.0' encoding='iso-8859-1'?>"
    
    a = LH.fromstring(xmlspec + "<html><body><p>Body</p></body></html>")
    b = LH.fromstring(xmlspec + "<html><meta /><body><p>Body</p></body></html>")
    
    print a # says element p while I would have expected html
    print b # says element html which is expected
    

    有人能解释为什么会这样吗?当你移除 xml 规范!有没有正确的方法来处理这个问题?

    1 回复  |  直到 7 年前
        1
  •  2
  •   Nishant Florentin    7 年前

    从20多分钟的研究得出的结论是:

    <?xml version='1.0' encoding='iso-8859-1'?><html><body><p>Body</p></body></html>

    不是有效的HTML,它是有效的XML。

    从技术上讲,

    <?xml version='1.0' encoding='iso-8859-1'?><html><meta /><body><p>Body</p></body</html>

    也不是有效的HTML,但LXML原谅了它。更可接受的兼容版本是 <head><meta /></head> 刚好在…之后 <html> 这是更好的,但仍然不是很好(为了使它成为一个有效的HTML,它需要有一个 <title> 里面 <head> 当然,还有一个不同的doctype)。

    参考文献:

    https://validator.w3.org

    https://www.xmlvalidation.com/