Python Scrapy,将多个子对象解析为同一个项目?

时间:2015-10-27 15:59:07

标签: python html xpath web-scraping scrapy

对于一个非营利性的大学作业,我试图抓住网站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表示类型,我想要做的是将它们放在一个由','分隔的字符串中。

有一种简单的方法吗?这是我抓取http://rateyourmusic.com/artist/kanye_west网站的示例网址。

1 个答案:

答案 0 :(得分:1)

一个简单的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()