Html 提取文本xpath片段

Html 提取文本xpath片段,html,xpath,scrapy,Html,Xpath,Scrapy,大家好,我想在scrapy中使用xpath从html块中提取所有文本 假设我们有这样一个块: <div> <p>Blahblah</p> <p><a>Bluhbluh</a></p> <p><a><span>Bliblih</span></a></p> </div> text_array = selector

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

假设我们有这样一个块:

<div>
   <p>Blahblah</p>
   <p><a>Bluhbluh</a></p>
   <p><a><span>Bliblih</span></a></p> 
</div>
text_array = selector.xpath('//div/p//text()').extract()

布拉布拉赫

布鲁布鲁

哎呀

我想将文本提取为[“Blahblah”、“Bluhbluh”、“Blihblih”]。我希望xpath递归地在div节点中查找文本。 我听说过:
//div/p[genderant或self::*]/text()
,但它不提取嵌套元素

干杯!
Seb

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

>>> 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']
>>> 
>>导入刮屑
>>>选择器=scrapy.selector(text=”“”
布拉布拉

…布鲁赫布鲁赫

…哎呀

... """) >>>[p.xpath(“string()”).selector.xpath('//div/p')中p的extract()] [u'Blahblah'],[u'Bluhbluh'],[u'Bliblih'] >>>进口经营者 >>>map(operator.itemgetter(0),[p.xpath(“string()”).extract(),用于selector.xpath('//div/p')]中的p) [u'Blahblah',u'Bluhbluh',u'Bliblih'] >>>
你很接近! 你所要做的就是将后代或自我的文本视为一种属性,而不是将其作为一种属性。
[]用于与属性“对话”,在您的例子中,p的属性是不存在的。

我喜欢@Elvila Gandelman的解决方案

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

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

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

//div/p//text()
因此,您的代码将如下所示:

<div>
   <p>Blahblah</p>
   <p><a>Bluhbluh</a></p>
   <p><a><span>Bliblih</span></a></p> 
</div>
text_array = selector.xpath('//div/p//text()').extract()

有趣的是,
selector.css('divp::text').extract()
如果您更喜欢使用
css
而不是
xpath