[英]Extracting text between html tags with multiple classes with DOM and 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.