小编典典

HTML XPath:提取与多个标签混合的文本?

scrapy

目标:从特定元素(例如li)中提取文本,而忽略各种混合在标签中的内容,即展平第一级子级,并简单地分别返回每个展平型子级的串联文本。

例:

<div id="mw-content-text"><h2><span class="mw-headline" >CIA</span></h2>
    <ol>
    <li>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>.</li>
    </ol>

    </Div>  

所需文字:

  • Central Intelligence Agency
  • Culinary Institute of America

除了周围的定位标记阻止简单的检索。

为了分别返回每个li标签,我们使用简单的方法:

//div[contains(@id,"mw-content-text")]/ol/li

但这还包括周围的锚标签等。

//div[contains(@id,"mw-content-text")]/ol/li/text()

仅返回属于li的直接子元素的文本元素,即’Central’,’.’…

然后寻找自我和后代的文本元素似乎合乎逻辑

//div[contains(@id,"mw-content-text")]/ol/li[descendant-or-self::text]

但这根本没有任何回报!

有什么建议?我正在使用Python,因此可以使用其他模块进行后期处理。

(我正在使用似乎符合XPath 1.0的Scrapy HtmlXPathSelector)


阅读 1015

收藏
2020-04-09

共1个答案

小编典典

有一个小问题:

//div[contains(@id,"mw-content-text")]/ol/li[descendant-or-self::text]

正确的表达式是:

//div[contains(@id,"mw-content-text")]/ol/li[descendant-or-self::text()]

但是,有一个更简单的表达式可以精确生成指定文本下所有文本节点的所需连接li

string(//div[contains(@id,"mw-content-text")]/ol/li)
2020-04-09