簡體   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