使用xpath选择一个接一个的元素

时间:2013-10-09 18:29:03

标签: xpath lxml

我见过类似的问题,但我见过的解决方案不适用于以下方面。我远非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']")

3 个答案:

答案 0 :(得分:13)

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

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

选择包含“标题2”的table标题的p后的第一个b兄弟

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

在包含“标题2”的table后按文档顺序选择第一个b

有关不同轴的详细信息,请参阅XPath 1.0 specifications

  •   

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

  •   

    follow-sibling 轴包含上下文节点的以下所有兄弟节点;如果上下文节点是属性节点或命名空间节点,则以下兄弟轴为空

答案 1 :(得分:9)

您需要使用以下 XPATH 1.0 使用轴preceding

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

答案 2 :(得分:0)

@paul trmbrth

我在代码中使用了您的建议,我想在其中获得下一页:

<div class="paging-numbers">
 <span class="paging-active-number">1</span>
 <a title="one-page 2" href="/one-page-2.bhtml" class="paging-number">2</a>
 <a title="one-page 3" href="/one-page-3.bhtml" class="paging-number">3</a>

那是我的代码

next = chrome.find_element_by_xpath('//span[@class="paging-active-number"]/following::a[@class="paging-number"][1]')
next.click()

但是,当我在最后一个可能的页面上时(该类具有class =“ paging-active-number”,因为我当前处于活动状态而处于活动状态),我没有以下任何类“ paging-number”,但是我的代码返回首页。