我有一个包含更多子元素的 div 元素。我只想从该 div 的所有子元素中获取文本。是否有任何内置功能或scrapy属性。
示例:我需要从http://www.jabong.com/z-collection-Olive-Mocassins-376735.html抓取面包屑
div id 以从 : breadcrumbs 中刮取内容 所需输出:主页 > 男装 > 鞋履 > 休闲鞋 > 莫卡辛鞋 > 橄榄莫卡辛鞋
我有一个包含更多子元素的 div 元素。我只想从该 div 的所有子元素中获取文本。是否有任何内置功能或scrapy属性。
示例:我需要从http://www.jabong.com/z-collection-Olive-Mocassins-376735.html抓取面包屑
div id 以从 : breadcrumbs 中刮取内容 所需输出:主页 > 男装 > 鞋履 > 休闲鞋 > 莫卡辛鞋 > 橄榄莫卡辛鞋
您可以使用一个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'