爬虫练习12306碰到的问题

本文介绍了如何将存储在字符串中的字典内容转换回Python字典,分别探讨了使用json.loads、eval和ast.literal_eval的方法。在json转换中遇到的双引号问题和无法处理特殊值(如False)的情况,而eval虽然能解决这些问题但存在安全隐患。最后,通过ast.literal_eval解决了转换和安全问题,成为推荐的解决方案。
摘要由CSDN通过智能技术生成

Python 如何将字符串转为字典

问题引出

当把用方法cookies = driver.get_cookies()获取到的cookies(字典类型)存储到记事本文件(.txt)中,写入时只能用 字符串类型
形如
"{'domain': 'www.12306.cn', 'httpOnly': False, 'name': 'BIGipServerpool_index', 'path': '/', 'secure': False, 'value': '837812746.43286.0000'}"
目标:去掉前后 “” 得到其中的 字典内容
{'domain': 'www.12306.cn', 'httpOnly': False, 'name': 'BIGipServerpool_index', 'path': '/', 'secure': False, 'value': '837812746.43286.0000'}

解决方法

(1) 使用 json 转换

举例:

import json

cookies = '{"domain": "www.12306.cn"}'
cookies_dict = json.loads(cookies)
print(cookies_dict)
print(type(cookies_dict))

结果:

{'domain': 'www.12306.cn'}
<class 'dict'>
注意:json 语法规定 数组或对象之中的字符串必须使用双引号 ,不能使用单引号

若把cookies = '{"domain": "www.12306.cn"}'换成cookies = "{'domain': 'www.12306.cn'}"再次运行,出现报错

json.decoder.JSONDecodeError: Expecting property name enclosed in double quotes: line 1 column 2 (char 1)
实际应用时却发现报错:
import json

cookies = "{'domain': 'www.12306.cn'," \
          " 'httpOnly': False," \
          " 'name': 'BIGipServerpool_index'," \
          " 'path': '/'," \
          " 'secure': False," \
          " 'value': '837812746.43286.0000'}"
cookies_dict = json.loads(cookies)
print(cookies_dict)
print(type(cookies_dict))
Traceback (most recent call last):
  File "D:\PycharmProjects\12306\main.py", line 8, in <module>
    cookies_dict = json.loads(cookies)
json.decoder.JSONDecodeError: Expecting property name enclosed in double quotes: line 1 column 2 (char 1) 

观察cookies字符串发现特殊元素:'secure': False
去掉该段代码后再次尝试,运行成功
发现貌似json无法转换 字典内含特殊值的字符串如 False True
由于尚未知道解决办法,放弃此方法(学术不精)

(2) 使用 eval方法

eval() 函数用来执行一个字符串表达式,并返回表达式的值。

运行:

cookies = "{'domain': 'www.12306.cn'}"
cookies_dict = eval(cookies)
print(cookies_dict)
print(type(cookies_dict))

cookies = '{"domain": "www.12306.cn"}'
cookies_dict = eval(cookies)
print(cookies_dict)
print(type(cookies_dict))

cookies = "{'domain': 'www.12306.cn', 'httpOnly': False, 'name': 'BIGipServerpool_index', 'path': '/', 'secure': False, 'value': '837812746.43286.0000'}"
cookies_dict = eval(cookies)
print(cookies_dict)
print(type(cookies_dict))

结果:

{'domain': 'www.12306.cn'}
<class 'dict'>
{'domain': 'www.12306.cn'}
<class 'dict'>
{'domain': 'www.12306.cn', 'httpOnly': False, 'name': 'BIGipServerpool_index', 'path': '/', 'secure': False, 'value': '837812746.43286.0000'}
<class 'dict'>

发现通过 eval 进行转换不存在上面使用 json 进行转换的问题
— — 既不用担心 单引号双引号 的问题
— — 也能解决 带有特殊值的元素 'secure': False
完美解决问题!!!

但使用 eval 存在安全性问题:
尤其当转换用户输入内容时,当用户恶意输入字符串时,eval会将其转换成操作执行!!!

(3)使用 ast.literal_eval 方法

运行:

import ast

cookies = "{'domain': 'www.12306.cn'}"
cookies_dict = ast.literal_eval(cookies)
print(cookies_dict)
print(type(cookies_dict))
cookies = '{"domain": "www.12306.cn"}'
cookies_dict = ast.literal_eval(cookies)
print(cookies_dict)
print(type(cookies_dict))
cookies = "{'domain': 'www.12306.cn', 'httpOnly': False, 'name': 'BIGipServerpool_index', 'path': '/', 'secure': False, 'value': '837812746.43286.0000'}"
cookies_dict = ast.literal_eval(cookies)
print(cookies_dict)
print(type(cookies_dict))

结果:

{'domain': 'www.12306.cn'}
<class 'dict'>
{'domain': 'www.12306.cn'}
<class 'dict'>
{'domain': 'www.12306.cn', 'httpOnly': False, 'name': 'BIGipServerpool_index', 'path': '/', 'secure': False, 'value': '837812746.43286.0000'}
<class 'dict'>

使用 ast.literal_eval 方法转换,应该是两全其美的解决方案
— — 既能解决json转换问题
— — 也能解决eval安全问题

小结:

综合 转换兼容 和 文件安全 使用优先级:
ast.literal_eval >> eval >> json
当没有外来输入时或确定环境相对安全可以使用 eval 毕竟内建函数节省文件空间

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值