我开始在python3中使用xpath并且正面临这种行为。这对我来说似乎非常错误。为什么它匹配span-text,而不匹配h3中的p-text?
>>> from lxml import etree
>>> result = "<h3><p>Hallo</p></h3>"
>>> tree = etree.HTML(result)
>>> r = tree.xpath('//h3//text()')
>>> print(r)
[]
>>> result = "<h3><span>Hallo</span></h3>"
>>> tree = etree.HTML(result)
>>> r = tree.xpath('//h3//text()')
>>> print(r)
['Hallo']
非常感谢!
答案 0 :(得分:3)
您的第一个XPath正确返回没有结果,因为相应的<h3>
中的tree
没有包含任何文本节点。您可以使用tostring()
方法查看树的实际内容:
>>> result = "<h3><p>Hallo</p></h3>"
>>> tree = etree.HTML(result)
>>> etree.tostring(tree)
'<html><body><h3/><p>Hallo</p></body></html>'
解析器可能执行此操作 - 将h3
转换为空元素 - 因为它认为标题标记内的段落无效(而标题内的span有效):Is it valid to have paragraph elements inside of a heading tag in HTML5 (P inside H1)?
要将p
元素保留在h3
中,您可以尝试使用不同的解析器,即使用BeautifulSoup's parser:
>>> from lxml.html import soupparser
>>> result = "<h3><p>Hallo</p></h3>"
>>> tree = soupparser.fromstring(result)
>>> etree.tostring(tree)
'<html><h3><p>Hallo</p></h3></html>'