2011-08-25 42 views
1

這裏Xpath的蟒蛇發現節點是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'] 

它打印出的所有環節,不論「特定文字X」,而我想是這樣的:

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

請建議

+0

那麼,基於提供的XML文檔,您想要的確切輸出是什麼?這不清楚。請編輯您的問題並添加此要求。 –

回答

1

我想你會需要一個XPath表達式每個H2特定文本。

給定一個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)] 

您可以在所以在這裏找到有關此方法的大量資源,很多答案(檢查我的答案也)。我認爲這是不難理解如何套用這個公式,什麼是困難的是要了解它必須被應用。

學分爲FORMUL去@邁克爾關鍵。只需google it a bit

我的表達式已擴展爲附加謂詞以處理您的特定情況並統一(|),並附加表達式來處理最後的h2

+0

感謝您的回答。輸出是:特定的文本內 'LINK1特定文本內1個 LINK2特定文本內1個 LINK3特定文本內1個 LINK1特定文本內2個 LINK2特定文本內2個 LINK3特定文本2'內部2個 LINK4。因此它也包括來自特定文本的鏈接2.而我只需要** **特定文本1錨文本。 – jerrymouse

+0

輸出什麼? –

+0

另外,如果可能的話,提供一些xpath提及這種高級方法的學習鏈接。 – jerrymouse

0

您可以使用XPath 2.0 starts-with(s, t)函數建立h2 - 值的匹配條件。

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

我不知道Python的任何XPath 2.0實現。所以這可能不起作用。但也許你可以改變你的需求的條件。

+0

感謝您的回覆。你可以在這裏更具體的代碼嗎? – jerrymouse

+0

不幸的是,這是行不通的。原因是'a'不是h2的孩子,而是h2的兄弟姐妹。如果所有的錨都在h2裏面,這個方法就行得通了。 – jerrymouse

+0

對不起,您的縮進感到困惑:) – 2011-08-25 11:11:54