数据提取之JSON与JsonPATH

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,它是的人们很容易的进行阅读和编写。同时也方便了机器进行解析和生成。适用于进行数据交互的场景,比如网站前台与后台之间的数据交互。

JSON和XML的比较可谓不相上下。

Python2.7中自带了JSON模块,直接import json就可以使用了。
官方博客:http://docs.python.org/library/json.html

Json在线解析网站:http://www.json.cn/#

JSON

json简单说就是javascript中的对象和数组,所以这两种结构就是对象和数据两种结构,通过这两种结构可以表示各种复杂的结构。

  1. 对象:对象在js中表示为{}括起来的内容,数据结构为{key:value,key:value,...}的键值对的结构,在面向对象的语言中,key为对象的属性,value为对应的属性值,所以很容易理解,取值方法为对象.key获取属性值,这个属性值的类型可以是数字、字符串、数组、对象这几种。
  2. 数组:数组在js中是中括号[]括起来的内容,数据结构为["Python", "javascript", "C++",..],取值方式和所有语言中一样,使用索引获取,字段值的类型可以是数字、字符串、数组、对象几种。

import json

json模块提供了四个功能:dumpsdumploadsload,用于字符串和python数据类型键进行转换。

1、json.loads()

把json格式字符串解码转换成Python对象从json到Python的类型转化对照如下:

#json_loads.pyimport jsonstrList = '[1, 2, 3, 4]'strDict = '{"city":"北京", "name":"大猫"}'json.loads(strList)
for str in strList:print(str)
#[1, 2, 3, 4]

json.loads(strDict)  #json数据自动按Unicode存储
#{u'city': u'\u5317\u4eac', u'name': u'\u5927\u732b'}

2、json.dumps()

实现python类型转化为json字符串,返回一个str对象。把一个Python对象编码转换成Json字符串,从python原始类型向json类型转化对照表如下:

#json_dumps.py#-*- coding:utf-8 -*-import json
import chardetlistStr = [1, 2, 3, 4]
tupleStr = (1, 2, 3, 4)
dictStr  = {"city":"北京", "name":"大猫"}print(type(json.dumps(listStr)))
# '[1, 2, 3, 4]'print(type(json.dumps(tupleStr)))
# '[1, 2, 3, 4]'#注意,json.dumps()序列化时默认使用ascii编码
#添加参数 ensure_ascii = False,禁用ascii编码,按utf-8编码
#chardet.detect()返回字典,其中confidence是检测精确度。print(json.dumps(dictStr))
#'{"city":"\\u5317\\u4eac", "name":"\\u5927\\u5218"}'print(chardet.detect(json.dumps(dictStr)))print(json.dumps(dictStr, ensure_ascii=False))print(chardet.detect(json.dumps(dictStr, ensure_ascii=False)))

chardet是一个非常优秀的编码识别模块,可通过pip安装

3. json.dump()

将Python内置类型序列化为json对象后写入文件

#json_dump.pyimport jsonlistStr = [{"city":"北京"}, {"name":"大刘"}]json.dump(listStr, open("listStr.json", "w"), ensure_ascii=False)dictStr = {"city":"北京", "name":"大刘"}
json.dump(dictStr.open("dictStr.json", "w"), ensure_ascii=False)

4.json.load()

读取文件中json形式的字符串元素转化成python类型

#-*- coding:utf-8 -*-import jsonstrList = json.load(open("listStr.json"))
print strList
# [{u'city': u'\u5317\u4eac'}, {u'name': u'\u5927\u5218'}]

strDict = json.load(open("dictStr.json"))
print strDict
# {u'city': u'\u5317\u4eac', u'name': u'\u5927\u5218'}

JsonPath

JsonPath是一种信息抽取类库,是从JSON文档中抽取指定信息的工具,提供多种原因实现保本:JavaScript/Python/PHP和Java

JsonPath对于JSON来说,相当于XPATH对于XML

下载地址:https://pypi.python.org/pypi/jsonpath
安装方法:点击Download URL链接下载jsonpath,解压之后执行python setup.py install
官方文档:http://goessner.net/articles/JsonPath

JsonPath与XPath语法对比:

Json结构清晰,可读性高,复杂度低,非常容易匹配,下表中对应了XPath的用法。

Xpath JSONPath 描述
/ $ 跟节点
. @ 现行节点
/ . or [] 取子节点
.. n/a 就是不管位置,选择所有符合条件的条件
* * 匹配所有元素节点
[] [] 迭代器标示(可以在里面做简单的迭代操作,如数组下标,根据内容选值等)
&#124 [,] 支持迭代器中做多选
[] ?() 支持过滤操作
n/a () 支持表达式计算
() n/a 分组,JsonPath不支持

实例:

我们以拉勾网城市JSON文件http://www.lagou.com/lbs/getAllCitySearchLabels.json为例,获取所有城市。

#-*- coding:utf-8 -*-import urllib2
import json
import jsonpath
import chardeturl = "http://www.lagou.com/lbs/getAllCitySearchLabels.json"
request = urllib2.Request(url)response  = urllib2.urlopen(request)html = response.read()#把json格式字符串转换成python对象
jsonobj = json.loads(html)#从根节点开始,匹配name节点
citylist = jsonpath.jsonpath(jsonobj, '$..name')print citylist
print(type(citylist))fp = open('city.json', 'w')content = json.dumps(citylist, ensure_ascii=False)
print content
fp.write(content.encode('utf-8'))fp.close()

注意事项:

json.loads()是把Json格式字符串解码转换成Python对象,如果在json.loads的时候出错,要注意被解码的Json字符的编码。

如果传入的字符串的编码不是UTF-8的话,需要制定字符编码的参数:encoding

dataDict = json.loads(jsonStrGBK);
  • dataJsonStr是JSON字符串,假设其编码本身是非UTF-8的话而是GBK的,那么上述代码会导致出错,改为对应的。
dataDict = json.loads(jsonStrGBK, encoding="GBK")
  • 如果dataJsonStr通过encoding指定了合适的编码,但是其中又包含了其它编码的字符,则需要先去将dataJsonStr转换为Unicode,然后再指定编码格式调用json.loads()
dataJsonStrUni = data.JsonStr.decode("GB2312")
dataDict = json.loads(dataJsontrUni, encoding="GB2312")

字符串编码转换

这是程序员最苦逼的地方,什么乱码之类的几乎都是由汉字引起的。
其实编码问题很好搞定,只要记住一点:

任何平台的任何编码,都能和Unicode互相转换。

UTF-8与GBK互相转换,那就先把UTF-8转换成Unicode,再从Unicode转换成GBK,反之同理。

# 这是一个 UTF-8 编码的字符串
utf8Str = "你好地球"# 1. 将 UTF-8 编码的字符串 转换成 Unicode 编码
unicodeStr = utf8Str.decode("UTF-8")# 2. 再将 Unicode 编码格式字符串 转换成 GBK 编码
gbkData = unicodeStr.encode("GBK")# 1. 再将 GBK 编码格式字符串 转化成 Unicode
unicodeStr = gbkData.decode("gbk")# 2. 再将 Unicode 编码格式字符串转换成 UTF-8
utf8Str = unicodeStr.encode("UTF-8")

decode的作用是将其它编码的字符串转换成Unicode编码
encode的作用是将Unicode编码转换成其他编码的字符串
一句话:UTF-8是对Unicode字符集记性编码的一种编码格式

参考链接:https://www.cnblogs.com/miqi1992/category/1105419.html

转载于:https://www.cnblogs.com/moying-wq/p/11570013.html

Python爬虫(十三)_JSON模块与JsonPath相关推荐

  1. Python爬虫进阶——urllib模块使用案例【淘宝】

    Python爬虫基础--HTML.CSS.JavaScript.JQuery网页前端技术 Python爬虫基础--正则表达式 Python爬虫基础--re模块的提取.匹配和替换 Python爬虫基础- ...

  2. Python爬虫之urllib模块2

    Python爬虫之urllib模块2 本文来自网友投稿 作者:PG-55,一个待毕业待就业的二流大学生. 看了一下上一节的反馈,有些同学认为这个没什么意义,也有的同学觉得太简单,关于Beautiful ...

  3. python爬虫之bs4模块(超详细)

    python爬虫之bs4模块(超详细) 一.bs4简介 二.使用方法 三.BeautifulSoup四大对象种类 (1)tag (2)NavigableString (3)BeautifulSoup ...

  4. python jsonpath库_Python爬虫(十六)_JSON模块与JsonPath

    本篇将介绍使用,更多内容请参考:Python学习指南 数据提取之JSON与JsonPATH JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,它是的人们很容易 ...

  5. python爬虫之requests模块2

    python网络爬虫之requests模块 session处理cookie proxies参数设置请求代理ip 基于线程池的数据爬取 一 获取验证码 步骤: ​ 1 注册云大码 http://www. ...

  6. Python爬虫-02 request模块爬取妹子图网站

    简介 #介绍:使用requests可以模拟浏览器的请求,比起之前用到的urllib,requests模块的api更加便捷(本质就是封装了urllib3)#注意:requests库发送请求将网页内容下载 ...

  7. 浅谈Python爬虫之BeautifulSoup模块

    目录 ​ 前言 安装库 导入库 解析文档示例 提取数据示例 CSS选择器 实例小项目 总结 前言 BeautifulSoup是主要以解析web网页的Python模块,它会提供一些强大的解释器,以解析网 ...

  8. Python爬虫【urllib模块】

    通用爬虫 爬虫的一般流程 1 初始化一批URL,将这些URL放入队列 2 从队列中取出这些URL,通过DNS解析IP,对IP对应的网站下载HTML页面,保存到本地服务器中,爬取完的URL放到已爬取队列 ...

  9. Python爬虫之Requests模块巩固深入案例

    爬虫之Requests模块巩固深入案例 requests实战之网页采集器 requests实战之破解百度翻译 requests实战之豆瓣电影爬取 requests实战之肯德基餐厅位置爬取 reques ...

最新文章

  1. Google Map API 开发基础--01
  2. 零基础是学java还是python-老男孩零基础学习|python和java那个更有发展前景?
  3. Go中线程和协程的区别
  4. Python DataFrame删除某一列中包含的特定元素所在的行
  5. G6 图可视化引擎——核心概念——节点/边/Combo——内置节点——内置节点总览
  6. (libgdx学习)TextInputListener
  7. vsftpd 配置-使用虚拟账户登录
  8. 用计算机用两个珠子能拨出那些数字,人教版一年级数学上册第三单元教案
  9. Handler消息机制详解,另对于MessageQueue阻塞线程的详解
  10. Mac怎么读写NTFS格式?Mac电脑重新安装NTFS卷
  11. 将csv格式转换为excel后缀为xlsx
  12. 照片拼图制作怎么弄?这几个方法或许能帮到你
  13. linux打开文件管理器的快捷键
  14. probability是什么意思_probability是什么意思_probability怎么读_probability翻译_用法_发音_词组_同反义词_可能性-新东方在线英语词典...
  15. JAVA电子产品购物平台计算机毕业设计Mybatis+系统+数据库+调试部署
  16. 复信号的傅里叶变换是什么?频谱是什么样子的?3D频谱图长啥样子?
  17. 在ipad上刷android系统更新,全自动刷安卓4.0 索尼SGPT111刷机教程
  18. jQuery 插件—— 懒加载
  19. 「低代码系列报道」华为云打造行业aPaaS集群,抢占SaaS发展黄金十年
  20. python中,设置三维图图形显示区银灰色背景为白色,或者是其他颜色

热门文章

  1. jQuery 常用的效果函数(一)
  2. 用户看法调查结果及分析(四)
  3. 人脸识别基础关键技术
  4. 深度学习新算法,完成字里行间的情绪识别
  5. 最大熵的Java实现
  6. 动态线条,随鼠标移动吸附效果
  7. Java并发工具类(闭锁CountDownLatch)
  8. MySQL多实例安装配置指南
  9. ES6之let(理解闭包)和const命令
  10. AppServ安装到一半卡住的问题