Python 如何在输出到CSV之前剥离碎片结果

Python 如何在输出到CSV之前剥离碎片结果,python,scrapy,Python,Scrapy,我试图从一些HTML中分离出整数,例如“ 5500英里 “ import scrapy class AlfaShortSpider(scrapy.Spider): name = 'alfashort' def start_requests(self): yield scrapy.Request(url = 'https://www.pistonheads.com/classifieds/used-cars/alfa-romeo/giulia',

我试图从一些HTML中分离出整数,例如“
5500英里

import scrapy

class AlfaShortSpider(scrapy.Spider):
    name = 'alfashort'

    def start_requests(self):
        yield scrapy.Request(url = 'https://www.pistonheads.com/classifieds/used-cars/alfa-romeo/giulia',
                             callback = self.parse_data)


    def parse_data( self, response ):
        advert = response.xpath( '//*[@class="ad-listing"]')
        title = advert.xpath( './/*[@class="listing-headline"]//h3/text()' ).extract()
        price = advert.xpath( './/*[@class="price"]/text()' ).extract()
        mileage = advert.xpath( './/*[@class="specs"]//li[1]/text()' ).extract()
        mileage = [item.strip() for item in mileage]
        mileage = [item.replace(',','') for item in mileage]
        mileage = [item.replace(' miles','') for item in mileage]

        for item in zip(title,price,mileage):
            price_data = {
                    'title' : item[0],
                    'price' : item[1],
                    'mileage' : item[2]
            }

            yield price_data 
我的代码成功地删除了逗号和“英里”,但在CSV输出中,我在该列中得到了不需要的空行,我认为这是由于原始源中的回车。我的CSV如下所示:

所以标题和价格栏都很好。但“里程”列是错误所在

import scrapy

class AlfaShortSpider(scrapy.Spider):
    name = 'alfashort'

    def start_requests(self):
        yield scrapy.Request(url = 'https://www.pistonheads.com/classifieds/used-cars/alfa-romeo/giulia',
                             callback = self.parse_data)


    def parse_data( self, response ):
        advert = response.xpath( '//*[@class="ad-listing"]')
        title = advert.xpath( './/*[@class="listing-headline"]//h3/text()' ).extract()
        price = advert.xpath( './/*[@class="price"]/text()' ).extract()
        mileage = advert.xpath( './/*[@class="specs"]//li[1]/text()' ).extract()
        mileage = [item.strip() for item in mileage]
        mileage = [item.replace(',','') for item in mileage]
        mileage = [item.replace(' miles','') for item in mileage]

        for item in zip(title,price,mileage):
            price_data = {
                    'title' : item[0],
                    'price' : item[1],
                    'mileage' : item[2]
            }

            yield price_data 

我的Strip命令有问题吗?

只需更改里程数的XPath即可

您将获得正确的输出:

title,price,mileage
ALFA ROMEO GIULIA (0) V6 BITURBO QUADRIFOGLIO                  2018 (2018),"£48,500",5500
ULEZ CHARGE EXEMPT! EURO 6  (2017),"£25,695",11450
ALFA ROMEO GIULIA (0) V6 BITURBO QUADRIFOGLIO NRING            2019 (2019),"£83,500",100
ALFA ROMEO GIULIA (0) TD SPECIALE                              2017 (2017),"£22,500",23700

您可以使用查找意外事件发生的时间点。您应该调试
milage
为空时的响应。也许你的请求被某种方式阻止了?你的csv看起来像这样吗?我添加了一个csv输出的屏幕截图。只有“里程”列插入了空行。所以,不仅一些里程数丢失了,其中的里程数和其他数据不一致。这是有效的。非常感谢你。你能解释一下这是怎么回事吗?我不熟悉XPath,但我的理解是[2]选择了该类型的第二个对象,但在我看来,每个/li/只有一个文本对象。如果答案有效,请接受。在第一个对象中,该值为空。
title,price,mileage
ALFA ROMEO GIULIA (0) V6 BITURBO QUADRIFOGLIO                  2018 (2018),"£48,500",5500
ULEZ CHARGE EXEMPT! EURO 6  (2017),"£25,695",11450
ALFA ROMEO GIULIA (0) V6 BITURBO QUADRIFOGLIO NRING            2019 (2019),"£83,500",100
ALFA ROMEO GIULIA (0) TD SPECIALE                              2017 (2017),"£22,500",23700