使用XPath在另一个元素后选择元素

17

我看过类似的问题,但是我看到的解决方案在以下情况下不起作用。我离XPath专家还很远。我只需要解析一些HTML。如何选择跟随Header 2的表格。我认为下面的解决方案应该可以工作,但显然没有。有人能帮我吗?

content = """<div>
<p><b>Header 1</b></p>
<p><b>Header 2</b><br></p>
<table>
<tr>
    <td>Something</td>
</tr>
</table>
</div>
"""

from lxml import etree
tree = etree.HTML(content)
tree.xpath("//table/following::p/b[text()='Header 2']")
2个回答

18

一些替代 @Arup 答案的方法:

tree.xpath("//p[b='Header 2']/following-sibling::table[1]")

选取包含文本“Header 2”的标头p元素后面的第一个table兄弟元素。

tree.xpath("//b[.='Header 2']/following::table[1]")

选取第一个包含"Header 2"的b标签后面按文档顺序的第一个table标签。

有关不同轴的详细信息,请参见XPath 1.0规范

  • following 轴包含与上下文节点在同一文档中,在上下文节点之后按文档顺序排列的所有节点,不包括任何后代节点,以及排除属性节点和命名空间节点

  • following-sibling 轴包含上下文节点的所有后续兄弟节点。如果上下文节点是属性节点或命名空间节点,则其 following-sibling 轴为空


12

您需要使用以下XPATH 1.0,使用Axes preceding

 //table[preceding::p[1]/b[.='Header 2']]

啊,好的。谢谢你提供代码和文档链接。这很有帮助。 - jseabold

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接