HTML XPath:在提取文本时有选择地避免标记



跟进: HTML XPath: 提取混合了多个标签的文本?

我使我的测试用例更加困难:

<div id="mw-content-text"><h2><span class="mw-headline" >CIA</span></h2>
<ol>
<li><small>Military</small> Central <a href="/Intelligence_Agency.html">Intelligence Agency</a>.</li>
<li>Culinary <a href="/Institute.html">Institute</a> of <a href="/America.html">America</a>.<br/>Renowned cooking school.</li>
</ol>
</div>  

我有相同的目标,即提取:

  • 中央情报局
  • 美国烹饪学院

我可以有选择地选择排除哪些标签吗?

我尝试过这样的事情(用于删除"军事"(:

id('mw-content-text')/ol/li[not(self::small)]

但该条件将应用于整个"li"节点,因此不受影响。

如果我做类似的事情

id('mw-content-text')/ol/li/*[not(self::small)]

然后我只过滤孩子,即使我成功地扔掉了"军事",我也扔掉了"中央"、"烹饪",即来自父母的文本。

我理解这棵树是这样的:

div -- li  
          -- small -- Military  
          -- Central  
          -- a     -- Intelligence Agency  
    -- li  
          -- Culinary  
          -- a     -- Institute  
          -- of  
          -- a    -- America  
          -- br  
          -- Renowned cooking school.  

这是对的吗?有没有办法说"李氏和李氏后代的文本元素,除了小的后代?怎么样'...除了 br 元素和所有后续文本元素?

同样,使用(部分(Pythonic解决方案也是可以接受的,尽管XPath是首选。


在坐下来阅读了 Erik Ray 的"学习 XML,第二版"的第 6 章"XPath 和 XPointer"之后,我想我已经掌握了它。我想出了以下公式:

id('mw-content-text')/ol/li//text()[not(parent::small) and not(preceding-sibling::br)]

在这种情况下,似乎无法连接文本节点的结果节点集。当我们简单地将 'li' 元素馈送到字符串函数时,得到的字符串值只是元素节点 li 后代的串联。但在这种情况下,我们需要做进一步的过滤,这样我们就会得到一个节点集(符合条件的文本节点(而不是单个元素节点。关于连接节点集,可以在此处找到一个有用的 SO 问题:用于返回合格子节点值的字符串串联的 XPath

如何改进此解决方案的任何建议?

使用

 /*/ol/li/descendant-or-self::*
          [text() and not(self::small)]
              /text()[not(preceding-sibling::br)]

相关内容

最新更新