【发布时间】:2013-10-15 07:14:45
【问题描述】:
我有一个包含更多子元素的 div 元素。我只想从该 div 的所有子元素中获取文本。是否有任何内置功能或scrapy属性。
示例: 我需要从http://www.jabong.com/z-collection-Olive-Mocassins-376735.html刮掉面包屑
从 : 面包屑中抓取内容的 div id 期望输出:首页 > 男装 > 鞋履 > 休闲鞋 > 莫卡辛鞋 > 橄榄色莫卡辛鞋
【问题讨论】:
我有一个包含更多子元素的 div 元素。我只想从该 div 的所有子元素中获取文本。是否有任何内置功能或scrapy属性。
示例: 我需要从http://www.jabong.com/z-collection-Olive-Mocassins-376735.html刮掉面包屑
从 : 面包屑中抓取内容的 div id 期望输出:首页 > 男装 > 鞋履 > 休闲鞋 > 莫卡辛鞋 > 橄榄色莫卡辛鞋
【问题讨论】:
您可以使用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'
【讨论】:
.join()的解决方案更新了我的答案@