最近因为工作太忙了,没有来得及及时更新自己的博客,自己这段时间也没有搞新技术,一直在修改公司的代码错误,真是苦逼呀,修改过程中也有点收获。分享这篇文章是自己工作中总结的怎样可以从大的json格式的文章中选取自己想要的字段。因为贷后所需要的发沉托运的字段太多了,如果一个个的查找浪费时间和浪费精力。
目标字段,这里首先分享一下json格式的字段如下:
json_dict =
{
"test1": "wx9fdb8ble7ce3c68f",
"test2": "123456789",
"testData1": {
"testdatason1": "97895455"
"testdatason2":3,
"testData2": [
{
"testshuzu1":"12"
"testshuzu1":"11"
},
{
"testshuzu2":"13"
"testshuzu2":"14"
},
,
{
"testshuzu3":"15"
"testshuzu3":"16"
}
]
}
}
这是从网上随便找的一篇,当然当我们爬取的类似json格式的文章的时候,这里就不分享其中类似的形式,解决办法是转化为json格式的文章,可从一下的技巧入手:json_data = '{"a":1,"b":2,"c":3,"d":4}' //类似这类的转化
这里针对这个字符串作者分享三种解析方法:
import demjson
import json
json_data = '{"a":1,"b":2,"c":3,"d":4}'
print eval(json_data)
print json.loads(json_data)
print demjson.decode(json_data)
以上的三种方法仅仅是针对上述,当然你会发现大多数的不规则的用这几个解决时都可以的,如果是无法解决恭喜你喜提正则表达式来解析。
好了进入正题,这里因为工作的代码,所以不便展示源码和json字段,这里只能告诉你方法。
我们知道上述的json_dict
经过转换我们可以通过字典的方式来,因为解析json作者这里还是终极目标转化为字典。
json_dict =
{
"test1": "wx9fdb8ble7ce3c68f",
"test2": "123456789",
"testData1": {
"testdatason1": "97895455"
"testdatason2":3,
"testData2": [
{
"testshuzu1":"12"
"testshuzu1":"11"
},
{
"testshuzu2":"13"
"testshuzu2":"14"
},
,
{
"testshuzu3":"15"
"testshuzu3":"16"
}
]
}
}
想要的字段:
"testshuzu3":"15"
"testshuzu3":"16"
大体上我们都是这样做的:
json_infos = json_dict['testData1']['testData2']
然后通过循环一个个的拿取值。
当然可以,不过这里作者想要强调的是,如果字段比较多,而写入CSV文件需要表头难道去一个个的添加查找,那是最笨的方法,这里直接上方法代码:
import sys
import demjson
import csv
import time
def fache():
fache_res= requests.post(url=url, headers=headers, data=data)
res_infos = demjson.decode(fache_res.text)
all_infos = res_infos['data']['table']['list']
for each_infos in all_infos:
item = {k: v for k, v in each_infos.items() if k in headers_key}
writer.writerow(item)
print 'this is %s page' % i
if __name__ == '__main__':
headers_key = {
"rowno": u"序号",
"OrderNum": u"运单号",
"billingDate": u"开单日期", //自己在大的json文件中想要的字段
"startCity": u"发站",
"toCity": u"到站",
"ConsignorName": u"托运人",
"ConsigneeName": u"收货人",
"GoodsName": u"货物名称",
"Numbers": u"件数",
"Weight": u"重量",
"totalPrice": u"合计运费",
"actual_price": u"实际运费",
"freight_price": u"运费",
"profit": u"单票毛利",
"ConsignorPhone": u"托运人电话",
"ConsigneePhone": u"收货人电话",
"Volume": u"体积"
}
header_k = headers_key.keys()
csv_file = open('cx-%d.csv' % (int(time.time() * 1000)), 'wb+')
writer = csv.DictWriter(csv_file, fieldnames=headers_key.keys())
writer.writeheader()
writer.writerow(headers_key)
fache()
这样做是不是方便了许多呢?欢迎讨论。如有好的想法作者会改正的。