2

可能有比我所做的更好的方法来做到这一点,因为我被困在一个隐喻的坑里。

我想获取特定节点下的一些节点。我想出了这个 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>inside a <ul>或 a <table>,或 a <table>inside a<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 邮件列表上发现了一些帖子,提倡“不包含任何后代或自我”过滤器,我认为这完全符合我的要求,但似乎没有使其成为最终规格。:(

4

1 回答 1

0

像 with 一样搜索//p是显式递归的——如果这不是你想要的,不要那样做!:)

如果你只想要一个p直接在一个有趣的下div,但它div可以在你的层次结构中的任何地方,这将被表示为:

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

...如果你只想要一个p直接在你的树中搜索相对的位置下,那就更简单了:

./p
于 2012-05-09T19:15:06.610 回答