提取文本xpath scrapy

时间:2014-10-10 14:31:45

标签: html xpath scrapy

大家好我想在scrapy中使用xpath从html块中提取所有文本

我们假设我们有一个这样的块:

<div>
   <p>Blahblah</p>
   <p><a>Bluhbluh</a></p>
   <p><a><span>Bliblih</span></a></p> 
</div>

我想将文本提取为[&#34; Blahblah&#34;,&#34; Bluhbluh&#34;,&#34; Blihblih&#34;]。我希望xpath以递归方式查找div节点中的文本。 我听过尝试过://div/p[descendant-or-self::*]/text()但它没有提取嵌套元素。

干杯! SEB

4 个答案:

答案 0 :(得分:5)

您可以在每个string()元素上使用XPath的p函数:

>>> import scrapy
>>> selector = scrapy.Selector(text="""<div>
...    <p>Blahblah</p>
...    <p><a>Bluhbluh</a></p>
...    <p><a><span>Bliblih</span></a></p> 
... </div>""")
>>> [p.xpath("string()").extract() for p in selector.xpath('//div/p')]
[[u'Blahblah'], [u'Bluhbluh'], [u'Bliblih']]
>>> import operator
>>> map(operator.itemgetter(0), [p.xpath("string()").extract() for p in selector.xpath('//div/p')])
[u'Blahblah', u'Bluhbluh', u'Bliblih']
>>> 

答案 1 :(得分:4)

>>> selector.xpath('//div/p/descendant-or-self::*/text()').extract()
[u'Blahblah', u'Bluhbluh', u'Bliblih']

你很亲密! 您所要做的就是考虑后代或自己的文本,而不是将其作为属性。 []用于&#34;说话&#34;属性,在你的情况下是p的属性,它们是不存在的。

答案 2 :(得分:1)

如果要从给定元素中获取所有text个节点,则需要此XPath:

//div/p//text()

所以您的代码将如下所示:

text_array = selector.xpath('//div/p//text()').extract()

答案 3 :(得分:0)

我喜欢@Elvira Gandelman的解决方案。

但是,还有另一种笨拙但更直观的方法:

response.xpath('(//div/p | //div/p/a | //div/p/a/span)/text()').extract()
['Blahblah', 'Bluhbluh', 'Bliblih']