2011-08-25 46 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