如何让XPath忽略嵌套节点?

时间:2012-05-09 19:05:15

标签: xml xpath

这可能是比我正在做的更好的方法,因为 我被困在一个隐喻的坑洞里。

我想获得特定节点下的一些节点。我上来了 使用此XPath表达式:

>>> content_tags = 'h1 h2 h3 h4 h5 h6 p ol ul dl table'.split() 
>>> content_xpath = './/*[%s]' % ' or '.join('self::%s' % i for i in content_tags) 
>>> content_xpath 
'.//*[self::h1 or self::h2 or self::h3 or self::h4 or self::h5 or 
self::h6 or self::p or self::ol or self::ul or self::dl or 
self::table]' 

任何列出的content_tags都可以是我所在的层次结构的顶部 想要,我想忽略可能同时存在的其他元素 或更高的水平。不幸的是,有时候里面有一个<p> <ul><table><table><ol>等等,我得到了 内部元素与外部元素一起作为单独的结果。有没有好办法 执行“剪切”以忽略可能嵌套在其中的节点 我找到了?还是有一些更好的方法来做到这一点,我 不知何故失踪?

这是我正在尝试解析的一个示例。

<div class="interesting"> 
<img src="ignore-this.jpg"/> 
<h1>I want this.</h1> 
<p>I want this, too.</p> 
<div class="sidebar"> 
<ul> 
<li><p>I only want one copy of this, inside the UL.</p></li> 
<li><p>Ditto.</p></li> 
</ul> 
</div> 
</div> 

谢谢!

顺便说一下,我在一个w3.org邮件列表上发现了一些提倡a “不要包括任何后代或自我”过滤器,我认为这样做 正是我想要的东西,但它似乎没有进入 最终规范。 :(

1 个答案:

答案 0 :(得分:0)

使用//p进行搜索是明确的递归 - 如果这不是您想要的,请不要这样做! :)

如果您只希望p直接位于有趣的div下,但div可以位于您的层次结构中的任何位置,则表示如下:

//div[@class='interesting']/p

...如果您只想要一个直接位于树中位置的p,则搜索是相对的,这甚至更简单:

./p