python 转义字符 html 爬虫
用python的requests包 抓取某些网页时,返回的html中,一些字段含有一些 转义字符 \\\\\\\
这些转义字符给我们后期处理带来一些麻烦, 比方说 运行js等
python用print()打印时,其实已经自动处理了一边转义字符
转自 https://blog.csdn.net/shenkunchang1877/article/details/79086886
python
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}
这个 博客 主要用于记录自己在工作领域的所学所思, 属于笔记类型. 同时也用于收集整理工作所需的资料, 以便提高工作效率, 减少重复的搜索工作.
开博的目标就是重内容轻形式, 要求界面简洁, 易于搜索. 博客内的代码, 默认使用MIT License (特别注明的除外).
博客内的转载内容会保留原链接, 图片多摘自网络, 难以一一查明来源, 如有侵权, 请及时联系dexiao101@gmail.com, 我会立刻删除. 望谅解.
posted on 2018-09-11 20:06 shidexiao 阅读(1063) 评论(0) 编辑 收藏 举报