繁体   English   中英

Xpath python在特定文本后找到节点

[英]Xpath python find node after specific text

这是HTML代码:

<div id="someid">
    <h2>Specific text 1</h2>
    <a class="hyperlinks" href="link"> link1 inside specific text 1</a>
    <a class="hyperlinks" href="link"> link2 inside specific text 1</a>
    <a class="hyperlinks" href="link"> link3 inside specific text 1</a>

    <h2>Specific text 2</h2>
    <a class="hyperlinks" href="link"> link1 inside specific text 2</a>
    <a class="hyperlinks" href="link"> link2 inside specific text 2</a>
    <a class="hyperlinks" href="link"> link3 inside specific text 2</a>
    <a class="hyperlinks" href="link"> link4 inside specific text 2</a>

    <h2>Specific text 3</h2>
    <a class="hyperlinks" href="link"> link1 inside specific text 3</a>
    <a class="hyperlinks" href="link"> link2 inside specific text 3</a>         

</div>  

我必须在每个“特定文本”下分别找到链接。 问题是,如果我在python中编写以下代码:

links = root.xpath("//div[@id='someid']//a")
for link in links:
    print link.attrib['href']

它打印所有链接,而与“ Specific Text x”无关,而我想要这样的内容:

print "link under Specific text:"+specific+" link:"+link.attrib['href']

请建议

我认为您需要为每个h2特定文本使用一个XPath表达式。

给定特定于h2的文本,您可以通过以下方式获得其与兄弟姐妹相邻的内容

    //div[@id='someid']/h2[.='Specific text 1']
     /following-sibling::a[
      count( . | following-sibling::h2[1]/preceding-sibling::*)
      = count(following-sibling::h2[1]/preceding-sibling::*)
      and preceding-sibling::h2[1][.='Specific text 1']]
    |
    //div[@id='someid']/h2[.='Specific text 1' and not(following-sibling::h2[1])]
    /following-sibling::a"

第二个//h2选择处理h2是最后一个的情况。

上面的表达式只是利用了XPath 1.0的交集公式:

$ns1[count(.|$ns2)=count($ns2)]

您可以在SO上找到很多有关此方法的资源,以及很多答案(也请查看我的答案)。 我认为不难理解如何应用此公式,难于理解何时必须应用它。

该公式的功劳归@Michael Key。 只是谷歌一点

我的表达式已扩展为具有附加谓词以处理您的特定情况,而统一( | )具有附加的表达式可处理最后一个h2

您可以使用XPath 2.0的starts-with(s, t)函数来构建h2值的匹配条件。

//div/h2[starts-with(text(), 'Specific text')]//a

我不知道任何适用于Python的XPath 2.0实现。 因此,这可能行不通。 但是也许您可以根据需要更改条件。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM