</p> <h3>内的xpath <p>为空

时间:2018-01-12 23:35:15

标签: python python-3.x xpath lxml

我开始在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']

非常感谢!

1 个答案:

答案 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>'