【问题标题】:How to strip Scrapy results before outputted to CSV如何在输出到 CSV 之前剥离 Scrapy 结果
【发布时间】:2019-04-30 14:00:31
【问题描述】:

我正在尝试将整数与某些 HTML 隔离开来,例如"
5,500 英里
”。

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 如下所示:

my CSV

所以标题和价格列没问题。但是 Mileage 列是错误所在。

我的 Strip 命令有问题吗?

【问题讨论】:

  • 您可以使用logging 找出意外发生的时间点。
  • 您应该调试milage 为空时响应的样子。也许您的请求以某种方式被阻止?
  • 你的 csv 在这个 question 中看起来像吗?
  • 我添加了我的 CSV 输出的屏幕截图。只有里程列插入了空白行。因此,不仅缺少一些里程数,而且其中的里程数与其他数据不一致。

标签: python scrapy


【解决方案1】:

只需更改里程的 XPath

来自

mileage = advert.xpath( './/*[@class="specs"]//li[1]/text()' ).extract()

mileage = advert.xpath( './/*[@class="specs"]//li[1]/text()[2]' ).extract()

你会得到正确的输出:

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

【讨论】:

  • 这行得通。非常感谢。你介意解释一下这是如何工作的吗?我是 XPath 的新手,但我的理解是 [2] 选择了该类型的第二个对象,但在我看来,每个 /li/ 只有一个文本对象
  • 如果有效,请接受答案。在第一个对象中,值为空。
猜你喜欢
  • 2011-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-10
  • 2015-05-01
  • 1970-01-01
  • 2017-07-28
相关资源
最近更新 更多