我有一个包含更多子元素的div元素。我想只抄写那个div中所有子元素的文本。是否有任何内置的功能或scrapy属性。
示例: 我需要从http://www.jabong.com/z-collection-Olive-Mocassins-376735.html
中抓取面包屑div id来抓取内容:breadcrumbs 期望的输出:主页>男士>鞋子>休闲鞋>软皮鞋> Olive Mocassins
答案 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}}