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()