0

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

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

div id 以从 : breadcrumbs 中刮取内容 所需输出:主页 > 男装 > 鞋履 > 休闲鞋 > 莫卡辛鞋 > 橄榄莫卡辛鞋

4

1 回答 1

4

您可以使用一个HtmlXPathSelector和一个 XPath 表达式来选择 ID 为“面包屑”的所有后代文本节点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()withunicode.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()andmap()再次:

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'
于 2013-10-15T07:38:28.493 回答