python爬取html,反转义,双斜杠(\\)转换成单斜杠(\)字符被json正常解析

新手刚学py不久,用正则爬取数据的时候获得了一段json数据格式的段落,抓取回来的时候发现本身的文档已经是加了双反斜杠\\  的字符串,这时候我用json.loads()格式化数据的时候出现错误,搞了我两天,参考了一下别人的资料,终于找到解决方法了搞定这个坑了,避免下次踩坑,先写下来。。。

报错信息如下:

json.decoder.JSONDecodeError: Expecting property name enclosed in double quotes: line 1 column 2 (char 1)

 

假设如下:

test1.py:

 

 
str = """{\\"count\\":4}"""  #爬虫抓取的数据段
print(str) 	#这里直接输出str
>>>{\"count\":4}
str = bytes(str, encoding='utf-8')
print(str)	#转换成bytes输出
>>>b'{\\"count\\":4}'
print(json.loads(str))	#输出出错
>>>json.decoder.JSONDecodeError: Expecting property name enclosed in double quotes: line 1 column 2 (char 1)

 

分析:

在控制台直接print输出:{\"count\":4}这是正确的格式。按理说能正常被json解析,如下:

test2.py:

 

 
str="{\"count\":4}"
print(str)
print(json.loads(str))
>>>{"count":4}  #直接输出,输出了不带斜杠\的字符串
>>>{'count': 4}	#这里能被json正常解析

以上说明print和json.loads都会自动去掉用作转义的反斜杠   \ "转换成 " 成为正常能被json解析的(不带转义)字符 ,所以这样是能被json解析的!但是test1中的第一个print输出只是将双斜杠转成单斜杠的字符串,去掉了单斜杠的转义,这样仍然是不能被解析的。test1的第二个print说明了这个问题,转换成byte是按字节原样输出的,显示的仍然是双斜杠,所以print和loads都会解析一层的转义即:{\\"count\\":4}去掉一个单斜杠变成{\"count\":4},应该要再去掉一层转义,即需要两次反转义才行,可惜我找遍资料也没找到python有解决这个的方法函数,不过最终在网上找到了解决方法。看下面:

 

总结:以上问题出现在抓取的数据的时候,python会自动把反斜杠\加上转义,比如这里的 “\”单反斜杠 会变成对应的双反斜杠"\\"  即:把单斜杠给转义了。这样自然不能被json正常解析。(ps:单层转义的字符串传入json.loads()时会自动处理掉)

解决方法:

1.使用eval函数

eval
  功能:将字符串str当成有效的表达式来求值并返回计算结果。
  语法: eval(source[, globals[, locals]]) -> value
  参数:
    source:一个Python表达式或函数compile()返回的代码对象
    globals:可选。必须是dictionary
    locals:可选。任意map对象

 

str = """{\\"count\\":4}"""
str2 = eval("'{}'".format(str))
print(str2)
print(json.loads(str2))

 

 

2.使用正则表达式:

str1 = re.sub(r'\\','',str)
print(str1)
print(json.loads(str1))
>>>{"count":4}   #以上两种都能正常输出得到json数据!!
>>>{'count': 4}
  • 10
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值