对于一个非营利性的大学作业,我试图抓住网站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网站的示例网址。
答案 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()