写这篇的源头是: 上司问我json解码你会么?
in fact 之前只接触过几次,所以去细致总结了一波
JSON (JavaScript Object Notation) 一种轻量级的数据交换格式; 嗯不要走,小编不只是无情的复制概念的机器哈哈
目录
json包含类型
json简单编写
爬虫json获得及处理
python json 库讲解
json支持啥?
ps :作图工具Xmind
python 简单编写
看起来像是python里类型的大杂烩,json的格式像是python的字典感觉,我们会联想到用{} / , / : 那我们模仿字典的格式自己试着写一个包含以上所有类型的简单json
{ "number": 123, "string": "first json", "boolean": true, l "array": [11,12,13], "object": { "ok": "fine", "judge": "good", "you":"me" }, "null": null }
然后用个json在线编辑器去核验
http://www.bejson.com/jsoneditoronline/
结果如下: OK了
以上只是为了让大家熟悉或者复习一下json的简单形式
强调
json里只能有双引号,字典里可单可双
json里的键,都是字符串格式
爬虫Json实例
很多时候我们拿到的数据是json格式,比如第三方给的,比如爬虫得到的混乱数据
我们拿Mac pro电脑的评论来看json文件 (其实是小编想换电脑了)
步骤:
1.获取评论真实链接
打开京东里Mac pro的评价
右键点击最下面inspect element
2. 找到对应的json文件
出现的界面正好是上面点击的结果(全部评价)
点击菜单栏里的network-点击JS
发现左边都是JS文件,找到对应的comments文件
点击右边的preview:哈哈 这样看着舒服多了
点击preview右边的headers:发现了真实的url
3.基本的爬虫
url='https://club.jd.com/comment/productPageComments.action?callback=fetchJSON_comment98&productId=100006729770&score=0&sortType=5&page=0&pageSize=10&isShadowSku=0&fold=1'r = requests.get(url)r.status_codetext = r.texttext
结果太多我不全部粘贴
4.处理成正确的json格式
方法1: json在线编辑器
方法2:正则表达式
方法1:
粘贴所有爬到的内容到我推荐过的网站
https://www.bejson.com
粘贴到方框内,根据提示改错:我们删去了开头的 'fetchJSON_comment98(, 和结尾的)';点击格式化校验:结果如下:(粘贴两个片段)
保存json文件 , 用json.loads(文件) 转换成python的格式就可以直接提取啦,这里应该是像你提取字典里内容一样(具体python在下面讲解)
方法二:正则匹配
目标提取text里guid,content,creationTime, isDelete 和isTop的信息
guid = re.findall('\"guid\":.*?(?=,)',r.text)content = re.findall('\"content\":.*?(?=,)',r.text)creationTime=re.findall('\"creationTime\":.*?(?=,)',r.text)isDelete =re.findall('\"isDelete\":.*?(?=,)',r.text)isTop = re.findall('\"isTop\":.*?(?=,)',r.text)
Package Json
官方文档:
https://docs.python.org/3/library/json.html
主要功能
loads()方法把字符串转换成数据类型
load()方法把文件打开从字符串转换成数据类型
dumps()方法把数据类型转换成字符串 。
dump()方法把数据类型转换成字符串并存储在文件中
loads & load
loads 传入字符串,load传入文件
json.
loads
(s, *, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, **kw)
使用 loads 将(包含JSON文档的str、bytes或bytearray实例)反序列化转换到Python对象。如果反序列化的数据不是有效的JSON文档,则会引发JSONDecodeError错误。
错误
loads转化字符
当我们把之前写的json用loads转换成python对象
类型从原来的str变成了dict
(因为原本字符串引号里面就是字典)
双引号变成了单引号
用python里dict的处理方式就好
load打开文件
我们用上一块json在线编辑器里保存的文件, 保存在桌面的mac.txt文档
然后用字典的方式处理吧
dumps & dump
json.
dumps
(obj, *, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None, separators=None, default=None, sort_keys=False, **kw)
json.
dump
(obj, fp, *, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None, separators=None, default=None, sort_keys=False, **kw)
发现只有 * 和fp不一样
因为dumps - 编码传入字符串,dump传入文件
dumps简单示例
-----------------------------------------------------------------
参数(以下从官网翻译过来)
跳过吧哈哈我也不想看
后面的例子只用到了indent缩进作用,和sortkey键排序作用
如果indent是一个非负整数或字符串,那么JSON数组元素和对象成员将使用缩进级别进行漂亮的打印。缩进级别为0、负数或" "只会插入新行。None(默认值)选择最紧凑的表示。使用一个正整数缩进每个级别的空格数。如果缩进是一个字符串(例如“\t”),该字符串用于缩进每个级别。
如果sort_keys为真(默认值:False),那么字典的输出将按键排序。
———————看与不看分割线————————
如果skipkeys为真(默认值:False),那么不属于基本类型(str、int、float、bool、None)的dict键将被跳过,而不会引发类型错误。
如果ensure_ascii为真(默认值),则保证输出将转义所有传入的非ascii字符; 如果ensure_ascii为假,这些字符将按原样输出。
如果check_circular为false(默认值:True),那么将跳过对容器类型的循环引用检查,而循环引用将导致溢出错误(或者更糟)。
如果allow_nan为false(默认值:True),则在严格遵循JSON规范的情况下序列化超出范围的浮点值(nan、inf、-inf)将是一个ValueError。如果allow_nan为真,将使用它们的JavaScript等价值(NaN、Infinity、-Infinity)。
如果指定,separators应该是一个(item_separator, key_separator)元组。如果缩进为None,那么默认值是(',',':'),否则为(',',':')。要获得最紧凑的JSON表示,应该指定(',',':')来消除空白。
- 在3.4版本中更改:如果缩进不为空,使用(',',':')作为默认值。
- 如果指定了默认值,则默认值应该是一个为无法序列化的对象调用的函数。它应该返回一个JSON可编码版本的对象或引发一个类型错误。如果未指定,则引发类型错误。
------------------------------------------------------------------
嗯真的好枯燥,我们暂时不考虑编码,我们用一下indent 和sort_keys举个例子,一个使用缩进,一个使用缩进和键排序,使得我们将python 语句转化成json时变得很好看。
第二个图既有缩进又按照键adefm的顺序排序了
代码可以直接食用
基本的就是这样啦