我在lxml中遇到了一个奇怪的错误:


 >>> s ='< html>< head>< noscript>< / noscript>< script>< / script>< meta>< / head>< / html>' 
>>> root = lxml.html.fromstring(s)
>>> root.xpath( '/ HTML /头/元')
>>> root.xpath('/ html / body / meta')
 [< Element meta at 0x2a92788>]



 meta标签应该在head元素中,而不是body。在这种情况下如何才能获得正确的元素?

答案 0 :(得分:2)
让我猜一下:你使用旧版本的Ubuntu(如12.04)吗?
实际上,它是lxml包使用的旧版预安装libxml2
库中的错误。在版本2.8.0的release notes中,他们提到HTML parser error with <noscript> in the <head>
的修复 - 所以我猜libxml2&gt; = 2.8.0的版本应该有效。 Ubuntu 12.04安装了2.7.8版本。
>>> import lxml.etree
>>> lxml.etree.LIBXML_COMPILED_VERSION
(2, 7, 8)
>>> lxml.etree.LIBXML_VERSION
(2, 9, 1)
我认为如果其中任何一个版本都是&gt; = 2.8.0,<noscript>
问题应该消失。
答案 1 :(得分:1)
这对我有用:
import lxml.html
s = '<html><head><noscript></noscript><script></script><meta></head></html>'
root = lxml.html.fromstring(s)
print(root.xpath('/html/head/meta'))
print(root.xpath('/html/body/meta'))
<强>输出:强>
[<Element meta at 0x10a123b8>]
[]
我使用的是Python 2.7.9和lxml版本3.4.2。