[英]Python lxml xpath find node with text()=concat('x', 'y')
[英]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.