繁体   English   中英

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

[英]HTML XPath: Extracting text mixed in with multiple tags?

目标:从特定元素(例如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>  

所需文字:

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

除了周围的锚标签阻止简单的检索。

要分别返回每个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,因此我愿意使用其他模块进行后期处理。

(我使用的是Scrapy HtmlXPathSelector,它似乎符合XPath 1.0)

你快到了。 有一个小问题

//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)

我认为以下将返回正确的结果:

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

请注意text()之前的双斜杠。 这意味着必须返回li以下任何级别的文本节点。

字符串连接很棘手。 这是使用lxml的快速解决方案:

>>> from lxml import etree
>>> doc = etree.HTML("""<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>""")
>>> for element in doc.xpath('//div[@id="mw-content-text"]/ol/li'):
...   print "".join(element.xpath('descendant-or-self::text()'))
...
Central Intelligence Agency.
Culinary Institute of America.

请注意, //可能性能差/意外执行,应尽可能避免,但使用示例HTML片段很难做到这一点。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM