16

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

3 回答 3

17

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

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

选择包含包含“Header 2”的标题之后的第一个table兄弟pb

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

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

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

  • 以下轴包含与上下文节点相同的文档中按文档顺序位于上下文节点之后的所有节点,不包括任何后代,不包括属性节点和命名空间节点

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

于 2013-10-09T21:04:30.527 回答
11

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

 //table[preceding::p[1]/b[.='Header 2']]
于 2013-10-09T18:35:17.750 回答
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",但我的代码返回到第一个页。

于 2020-06-10T22:18:22.463 回答