【问题标题】:Keep / Replace empty values in getall() with Scrapy用 Scrapy 保留 / 替换 getall() 中的空值
【发布时间】:2020-12-01 08:57:00
【问题描述】:

我想从网站上抓取一些元素,我必须保持值的顺序。 比如:

def parse(self, response):
    id_num = response.css('td:nth-child(1)::text').getall()
    issued_at = response.css(
        '.align-center.xcrud-current::text').getall()
    exchange = response.css(
        '.xcrud-current+ .align-center::text').getall()
    base_currency = response.css(
        '.align-center:nth-child(4)::text').getall()
    coin = response.css(
        '.align-center:nth-child(5)::text').getall()
    direction = response.css(
        '.align-center:nth-child(6)::text').getall()
    ask = response.css(
        '.align-right:nth-child(7)::text').getall()
    target = response.css(
        '.align-right:nth-child(8)::text').getall()
    highest = response.css(
        '.align-right:nth-child(9)::text').getall()
    lowest = response.css(
        '.align-right:nth-child(10)::text').getall()
    status = response.css(
        'td:nth-child(11)::text').getall()
    close_time = response.css(
        '.align-right~ .align-center::text').getall()
    dca_level = response.css(
        '.align-right:nth-child(13)::text').getall()

    for id_num, issued_at, exchange, base_currency, coin, direction, ask, target, highest, lowest, status, close_time, dca_level in\
            zip(id_num, issued_at, exchange, base_currency, coin, direction, ask, target, highest, lowest, status, close_time, dca_level):

        yield{
            'Id': id_num,
            'Issued At': issued_at,
            'Exchange': exchange,
            'Base Currency': base_currency,
            'Coin': coin,
            'Direction': direction,
            'Ask': ask,
            'Target': target,
            'Highest': highest,
            'Lowest': lowest,
            'Status': status,
            'Close Time': close_time,
            'DCA Level': dca_level
        }

基本上,ID 都是正确的,因为它们都存在,而 close_time 并不总是存在,因此输出 CSV 会被截断。如果我不使用 ::text,则所有元素都会被占用。

例如:

Id,Issued At,Exchange,Base Currency,Coin,Direction,Ask,Target,Highest,Lowest,Status,Close Time,DCA Level
499762,01/12/2020 08:46:40,binance,USDT,CTK,LONG,1.208900000000,1.231802400000,9.975000000000,9.927000000000,open,01/12/2020 08:25:00,0
499837,01/12/2020 08:46:17,kraken,USD,AUD,LONG,0.737670000000,0.745784370000,0.000003860000,0.000003840000,open,01/12/2020 08:30:00,0

我想要的是保留/替换空值。

【问题讨论】:

  • 我认为您不能使用getall(),但如果没有看到您的response 文本示例,我不确定。问题是,您遇到的问题是,例如:<id_num>.getall() 返回 10 个元素,但 <exchange>.getall() 返回 9。好吧,您不知道丢失元素的位置。它可能是第一个,中间或最后。您需要“遍历”元素并查找某些属性,而不是执行 getall()
  • 没错!您知道解决问题的任何方法吗?我应该浏览这些列表吗?
  • 所以,我需要查看您正在解析的源以给出一个具体的例子......但一个通用的例子是:我对scappy 没有任何经验,但它看起来像可以将 DOM 表示为 python 对象。这意味着您可以沿着页面“行走”并在行走时构建您的结构。这将允许您拥有if this field doesn't exist, return "blank" 和您认为合适的任何其他条件。那有意义吗?特别是,我会查看包含 align-center 类元素的元素并遍历它们。
  • 可以通过这种方式解决,但我在想一个更少“pythonic”和更多“Scrapy”的解决方案。那我等别人回答
  • 如果你想有人回答,你需要显示数据。目前你的问题只是你使用zip() 和不均匀的列表。您的列表不均匀,因为您使用 CSS 选择器来选择与特定模式匹配的元素。根据定义,由于有时值是空的,因此 CSS 选择器不会选择它们。 ...

标签: python-3.x web-scraping scrapy


【解决方案1】:

您需要重写 parse 回调以处理单个项目:

def parse(self, response):
    for item in response.css('your_epxression to_get list_of_items'):
        id_num = item.css('td:nth-child(1)::text').get()
        issued_at = item.css(
        '.align-center.xcrud-current::text').get()
        ...
        yield {'Id': id_num, 'Issued At': issued_at, ...}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-12
    • 2014-02-04
    • 1970-01-01
    • 1970-01-01
    • 2020-01-20
    • 2014-04-24
    • 1970-01-01
    • 2020-03-17
    相关资源
    最近更新 更多