【问题标题】:using xpath to select an element after another使用xpath一个接一个地选择一个元素
【发布时间】:2013-10-17 06:33:22
【问题描述】:

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

【问题讨论】:

    标签: xpath lxml


    【解决方案1】:

    @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”,但是我的代码返回首页。

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 啊,好的。感谢您的代码和文档链接。这很有帮助。
      【解决方案3】:

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

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

      选择p 之后的第一个table 兄弟,其中包含b 标头,其中包含“标头2”

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

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

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-13
        • 1970-01-01
        • 2016-07-24
        • 2016-11-26
        相关资源
        最近更新 更多