提取文本xpath scrapy

eag*_*man 4 html xpath scrapy

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

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

<div>
   <p>Blahblah</p>
   <p><a>Bluhbluh</a></p>
   <p><a><span>Bliblih</span></a></p> 
</div>
Run Code Online (Sandbox Code Playgroud)

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

干杯! 勒布

pau*_*rth 5

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

>>> 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']
>>> 
Run Code Online (Sandbox Code Playgroud)


Elv*_*man 5

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

你很接近!您所要做的就是将后代或自身的文本视为属性,而不是将其作为属性。[] 用于与属性“交谈”,在您的情况下是 p 的属性,这些属性是不存在的。