您将如何在Python中清理该词典?

时间:2019-03-20 11:16:44

标签: python dictionary web-scraping

这是我第一次尝试构建非Web的东西并涉及逻辑编码。

请在下面查看这本令人敬畏的字典:

  Messy_Dict=
    {
        'name': "['\\r\\n                  NASDAQ: BKEP\\r\\n          ']", 
        'underlying': "['1.12']", 
        'strike_prices_list': ["['2.50'", " '5.00'", " '7.50']"], 
        'call_bid': ["['\\r\\n0.05            '", " '\\r\\n0.00            '", " '\\r\\n0.00            ']"], 
        'put_ask': ["['\\r\\n2.10            '", " '\\r\\n4.50            '", " '\\r\\n7.00            ']"]
    }

我想做的是清理每个字典值中不必要的子字符串,以获得类似这样的内容:

Clean_Dict=
    {
        'name': "BKEP", 
        'underlying': "1.12", 
        'strike_prices_list': ["2.50", "5.00", "7.50"], 
        'call_bid': ["0.05", "0.00", "0.00"], 
        'put_ask': ["2.10", "4.50", "7.00"]
    }

我设法从 Messy_Dict 升级到 Clean_Dict ,但是我使用了很野蛮的方法。我只是说它包括一个for循环和多个strip(),replace('','')方法。而且让我很难看清.py文件中的那段代码。

所以我想,在执行将Messy_Dict转换为Clean_Dict的所需任务时,是否还有一种更优雅的方法?我感觉好像我的基本面中缺少什么。

编辑

def parse(self, response):
        strike_prices_main = response.css('.highlight , .aright .strike-col').css('::text').extract()
        if not strike_prices_main:
            pass
        else:
            name = response.css('#instrumentticker::text').extract()
            strike_prices_list = response.css('.aright .strike-col').css('::text').extract()
            call_bid = response.css('.aright td:nth-child(5)').css('::text').extract()
            put_ask = response.css('.aright td:nth-child(14)').css('::text').extract()
            underlying = response.css('.pricewrap .bgLast').css('::text').extract()
            file.write('%s|%s|%s|%s|%s\n'%(name,underlying,strike_prices_list,call_bid,put_ask))

使用蜘蛛爬行!

2 个答案:

答案 0 :(得分:0)

也许是这样的:

Usage: autopypi [OPTIONS] PKG_DIR

  Python command line tool to setup Python package automatically.
  Example:      $ autopypi your-package-root-directory -r
  Example:      $ cd your-package-root-directory
                $ autopypi . -r

Options:
  -r, --real          Use the real PyPi index (instead of test PyPi).
  --help              Show this message and exit.

答案 1 :(得分:-1)

您可以使用正则表达式。

示例:

import re

messy_dict = {
    'name': "['\\r\\n                  NASDAQ: BKEP\\r\\n          ']", 
    'underlying': "['1.12']", 
    'strike_prices_list': ["['2.50'", " '5.00'", " '7.50']"], 
    'call_bid': ["['\\r\\n0.05            '", " '\\r\\n0.00            '", " '\\r\\n0.00            ']"], 
    'put_ask': ["['\\r\\n2.10            '", " '\\r\\n4.50            '", " '\\r\\n7.00            ']"]
}

for key in messy_dict:
    stripfunc = lambda x: re.sub('[^\d\.]', '', str(x))
    if type(messy_dict[key]) is list:
        messy_dict[key] = [stripfunc(x) for x in messy_dict[key]]
    else:
        messy_dict[key] = stripfunc(messy_dict[key])

print(messy_dict)

说明:[^]匹配集合中未包含的任何内容。 \ d用于数字值,反斜杠转义点。使用str(val)将字符串从列表中删除。

输出:{'name': '', 'underlying': '1.12', 'strike_prices_list': ['2.50', '5.00', '7.50'], 'call_bid': ['0.05', '0.00', '0.00'], 'put_ask': ['2.10', '4.50', '7.00']}

编辑:只是注意到您还想保留该点。更新了代码。