从Scrapy中的数字中去除逗号

时间:2019-04-10 17:20:05

标签: python string scrapy

因此,我正在一个学校项目中使用Scrapy将数据提取到CSV文件中。数据在网站上有逗号,但是我想从数字中去除逗号,因为我要拉的某些行有三个数字,而用逗号则数据全部失真。

在下面的图像中可以看到黄色的逗号被剥去,但是在粉红色的高亮处仍然有逗号。

enter image description here

似乎在使用replace函数时,它适用于某些行,但不适用于其他行。无法弄清楚我哪里出了问题。这是我的代码:

# -*- coding: utf-8 -*-
import scrapy


class PsaSpider(scrapy.Spider):
    name = 'psa'
    allowed_domains = ['psacard.com']
    start_urls = ['https://www.psacard.com/pop/t206/']

    def parse(self, response):
        rows = response.css('table.pop-grid tbody tr')
        for row in rows:
            yield {
            'name' : row.css('td')[0].css('span.t206-pop-title::text').extract_first(default='').strip(),
            'variety' : row.css('td')[0].css('span.variety::text').extract_first(default='').strip(),
            'auth' : [x.strip().replace(',','') for x in row.xpath('td[3]//text()').extract()],
            'psa1': [x.strip().replace(',','') for x in row.xpath('td[4]//text()').extract()],
            'psa1.5': [x.strip().replace(',','') for x in row.xpath('td[5]//text()').extract()],
            'psa2': [x.strip().replace(',','') for x in row.xpath('td[6]//text()').extract()],
            'psa3': [x.strip().replace(',','') for x in row.xpath('td[7]//text()').extract()],
            'psa4': [x.strip().replace(',','') for x in row.xpath('td[8]//text()').extract()],
            'psa5': [x.strip().replace(',','') for x in row.xpath('td[9]//text()').extract()],
            'psa6': [x.strip().replace(',','') for x in row.xpath('td[10]//text()').extract()],
            'psa7': [x.strip().replace(',','') for x in row.xpath('td[11]//text()').extract()],
            'psa8': [x.strip().replace(',','') for x in row.xpath('td[12]//text()').extract()],
            'psa9': [x.strip().replace(',','') for x in row.xpath('td[13]//text()').extract()],
            'psa10': [x.strip().replace(',','') for x in row.xpath('td[14]//text()').extract()],
            }

1 个答案:

答案 0 :(得分:1)

您确定要使用逗号吗?我认为您在此处的破折号有问题。尝试这样的事情:

def parse(self, response):
    def strip_second(sel, xpath):
        return sum([int(x.strip().replace(',', '')) for x in sel.xpath(xpath).extract() if u'-' not in x])

    def strip_first(sel, css):
        return sel.css(css).get('').strip()

    rows = response.css('table.pop-grid tbody tr')
    for row in rows:
        td = row.css('td')[0]
        yield {
            'name': strip_first(td, 'span.t206-pop-title::text'),
            'variety': strip_first(td, 'span.variety::text'),
            'auth': strip_second(row, 'td[3]//text()'),
            'psa1': strip_second(row, 'td[4]//text()'),
            'psa1.5': strip_second(row, 'td[5]//text()'),
            'psa2': strip_second(row, 'td[6]//text()'),
            'psa3': strip_second(row, 'td[7]//text()'),
            'psa4': strip_second(row, 'td[8]//text()'),
            'psa5': strip_second(row, 'td[9]//text()'),
            'psa6': strip_second(row, 'td[10]//text()'),
            'psa7': strip_second(row, 'td[11]//text()'),
            'psa8': strip_second(row, 'td[12]//text()'),
            'psa9': strip_second(row, 'td[13]//text()'),
            'psa10': strip_second(row, 'td[14]//text()'),
        }

输出示例为:

{'psa1.5': [u'0', u'0'], 'auth': [u'2'], 'psa10': [u'0'], 'psa9': [u'0', u'0'], 'psa8': [u'0', u'0', u'0'], 'name': u'Wheat, Zack', 'variety': '', 'psa4': [u'0', u'0', u'0'], 'psa5': [u'0', u'1', u'0'], 'psa6': [u'0', u'0', u'0'], 'psa7': [u'0', u'0', u'0'], 'psa1': [u'0', u'0'], 'psa2': [u'0', u'0', u'0'], 'psa3': [u'0', u'0', u'0']}