Python Scrapy,将多个子对象解析成同一个项目?
Python Scrapy, parsing multiple child objects into the same item?
为了一项非营利性大学作业,我正在尝试抓取网站 www.rateyourmusic.com,我能够轻松抓取大部分内容,但在尝试抓取一个 html元素.
具体来说,我正在尝试抓取艺术家的流派,但是许多艺术家都是多种流派,我无法抓取所有的流派,这是我的解析方法:
def parse_dir_contents(self, response):
item = rateyourmusicartist()
#get the genres of the artist
for sel in response.xpath('//a[@class="genre"]'):
item['genre'] = sel.xpath('text()').extract()
yield item
通常有多个 //a[@class="genre"]
表示流派的 xpath,我想做的是将它们放在一个字符串中,用 ', ' 分隔。
有没有简单的方法来做到这一点?这是我正在抓取的网站的示例 url http://rateyourmusic.com/artist/kanye_west。
一个简单的 str.join()
就可以解决问题:
", ".join(response.xpath('//a[@class="genre"]/text()').extract())
演示(来自Scrapy Shell):
$ scrapy shell http://rateyourmusic.com/artist/kanye_west
In [1]: ", ".join(response.xpath('//a[@class="genre"]/text()').extract())
Out[1]: u'Hip Hop, Pop Rap, Experimental Hip Hop, Hardcore Hip Hop, Electropop, Synthpop'
请注意,如果您使用 Item Loaders,您可以使它更干净:
from scrapy.loader.processors import Join
loader = MyItemLoader(response=response)
loader.add_xpath("genre", '//a[@class="genre"]/text()', Join(", "))
yield loader.load_item()
为了一项非营利性大学作业,我正在尝试抓取网站 www.rateyourmusic.com,我能够轻松抓取大部分内容,但在尝试抓取一个 html元素.
具体来说,我正在尝试抓取艺术家的流派,但是许多艺术家都是多种流派,我无法抓取所有的流派,这是我的解析方法:
def parse_dir_contents(self, response):
item = rateyourmusicartist()
#get the genres of the artist
for sel in response.xpath('//a[@class="genre"]'):
item['genre'] = sel.xpath('text()').extract()
yield item
通常有多个 //a[@class="genre"]
表示流派的 xpath,我想做的是将它们放在一个字符串中,用 ', ' 分隔。
有没有简单的方法来做到这一点?这是我正在抓取的网站的示例 url http://rateyourmusic.com/artist/kanye_west。
一个简单的 str.join()
就可以解决问题:
", ".join(response.xpath('//a[@class="genre"]/text()').extract())
演示(来自Scrapy Shell):
$ scrapy shell http://rateyourmusic.com/artist/kanye_west
In [1]: ", ".join(response.xpath('//a[@class="genre"]/text()').extract())
Out[1]: u'Hip Hop, Pop Rap, Experimental Hip Hop, Hardcore Hip Hop, Electropop, Synthpop'
请注意,如果您使用 Item Loaders,您可以使它更干净:
from scrapy.loader.processors import Join
loader = MyItemLoader(response=response)
loader.add_xpath("genre", '//a[@class="genre"]/text()', Join(", "))
yield loader.load_item()