大家好我想在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
答案 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']