[英]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.