后续:HTML XPath: Extracting text mixed in with multiple tags?
我让我的测试案例变得更加困难:
<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撰写的第6章“学习XML,第二版”的第10章“XPath和XPointer”后,我想我已经掌握了它。我想出了以下表述:
id('mw-content-text')/ol/li//text()[not(parent::small) and not(preceding-sibling::br)]
在这种情况下,似乎无法连接结果节点的文本节点集。当我们简单地将'li'元素提供给string function时,结果字符串值只是元素节点li的后代的连接。但在这种情况下,我们需要进行进一步的过滤,这样我们就会得到一个节点集(合格的文本节点)而不是单个元素节点。关于连接节点集,可以在此处找到一个有用的SO问题:XPath to return string concatenation of qualifying child node values
有关如何改进此解决方案的任何建议吗?
答案 0 :(得分:2)
使用强>:
/*/ol/li/descendant-or-self::*
[text() and not(self::small)]
/text()[not(preceding-sibling::br)]