如何使用scrapy从包含更多div的div中仅提取文本

时间:2013-10-15 07:14:45

标签: python scrapy

我有一个包含更多子元素的div元素。我想只抄写那个div中所有子元素的文本。是否有任何内置的功能或scrapy属性。

示例: 我需要从http://www.jabong.com/z-collection-Olive-Mocassins-376735.html

中抓取面包屑

div id来抓取内容:breadcrumbs 期望的输出:主页>男士>鞋子>休闲鞋>软皮鞋> Olive Mocassins

1 个答案:

答案 0 :(得分:3)

您可以使用HtmlXPathSelector和XPath表达式选择具有ID“breadcrumbs”的div的所有后代文本节点,例如id("breadcrumbs")//text()

为了说明这一点,我将使用scrapy shell命令,该命令为您提供HtmlXPathSelector个实例,hxs

paul@wheezy:~$ scrapy shell http://www.jabong.com/z-collection-Olive-Mocassins-376735.html
...
2013-10-15 09:30:06+0200 [default] DEBUG: Crawled (200) <GET http://www.jabong.com/z-collection-Olive-Mocassins-376735.html> (referer: None)
[s] Available Scrapy objects:
[s]   hxs        <HtmlXPathSelector xpath=None data=u'<html><head><meta http-equiv="Content-Ty'>
...
In [1]: hxs.select('id("breadcrumbs")//text()').extract()
Out[1]: 
[u'\r\n                                    ',
 u'Home',
 u'\r\n                                                ',
 u'>',
 u'\r\n                                                                                                ',
 u'Men',
 u'\r\n                                                ',
 u'>',
 u'\r\n                                                                                                ',
 u'Shoes',
 u'\r\n                                                ',
 u'>',
 u'\r\n                                                                                                ',
 u'Casual Shoes',
 u'\r\n                                                ',
 u'>',
 u'\r\n                                                                                                ',
 u'Moccasins',
 u'\r\n                                                ',
 u'>',
 u'\r\n                                                                                                ',
 u'Olive Mocassins',
 u'\r\n                                                         \r\n',
 u'\r\n        ',
 u'\r\n\r\n        ']

如果您需要删除这些空格字符,可以将map()unicode.strip

一起使用
In [2]: map(unicode.strip, hxs.select('id("breadcrumbs")//text()').extract())
Out[2]: 
[u'',
 u'Home',
 u'',
 u'>',
 u'',
 u'Men',
 u'',
 u'>',
 u'',
 u'Shoes',
 u'',
 u'>',
 u'',
 u'Casual Shoes',
 u'',
 u'>',
 u'',
 u'Moccasins',
 u'',
 u'>',
 u'',
 u'Olive Mocassins',
 u'',
 u'',
 u'']

In [3]: 

您可以使用filter()

删除这些空行
In [4]: filter(bool, map(unicode.strip, hxs.select('id("breadcrumbs")//text()').extract()))
Out[4]: 
[u'Home',
 u'>',
 u'Men',
 u'>',
 u'Shoes',
 u'>',
 u'Casual Shoes',
 u'>',
 u'Moccasins',
 u'>',
 u'Olive Mocassins']

In [5]: 

这是使用str.join()map()再次使用In [9]: ' '.join(map(unicode.strip, hxs.select('id("breadcrumbs")//text()').extract())).strip() Out[9]: u'Home > Men > Shoes > Casual Shoes > Moccasins > Olive Mocassins' 作为单个字符串获取面包屑的单行程序:

In [10]: ' '.join(filter(bool, map(unicode.strip, hxs.select('id("breadcrumbs")//text()').extract())))
Out[10]: u'Home > Men > Shoes > Casual Shoes > Moccasins > Olive Mocassins'

甚至:

{{1}}