Python:數(shù)據(jù)提取之JSON與JsonPATH

      網(wǎng)友投稿 1217 2022-05-30

      JSON(JavaScript Object Notation) 是一種輕量級的數(shù)據(jù)交換格式,它使得人們很容易的進(jìn)行閱讀和編寫。同時(shí)也方便了機(jī)器進(jìn)行解析和生成。適用于進(jìn)行數(shù)據(jù)交互的場景,比如網(wǎng)站前臺(tái)與后臺(tái)之間的數(shù)據(jù)交互。

      JSON和XML的比較可謂不相上下。

      Python 2.7中自帶了JSON模塊,直接import json就可以使用了。

      官方文檔:http://docs.python.org/library/json.html

      Json在線解析網(wǎng)站:http://www.json.cn/#

      JSON

      json簡單說就是javascript中的對象和數(shù)組,所以這兩種結(jié)構(gòu)就是對象和數(shù)組兩種結(jié)構(gòu),通過這兩種結(jié)構(gòu)可以表示各種復(fù)雜的結(jié)構(gòu)

      對象:對象在js中表示為{ }括起來的內(nèi)容,數(shù)據(jù)結(jié)構(gòu)為?{ key:value, key:value, ... }的鍵值對的結(jié)構(gòu),在面向?qū)ο蟮恼Z言中,key為對象的屬性,value為對應(yīng)的屬性值,所以很容易理解,取值方法為 對象.key 獲取屬性值,這個(gè)屬性值的類型可以是數(shù)字、字符串、數(shù)組、對象這幾種。

      數(shù)組:數(shù)組在js中是中括號[ ]括起來的內(nèi)容,數(shù)據(jù)結(jié)構(gòu)為?["Python", "javascript", "C++", ...],取值方式和所有語言中一樣,使用索引獲取,字段值的類型可以是 數(shù)字、字符串、數(shù)組、對象幾種。

      import json

      json模塊提供了四個(gè)功能:dumps、dump、loads、load,用于字符串 和 python數(shù)據(jù)類型間進(jìn)行轉(zhuǎn)換。

      1. json.loads()

      把Json格式字符串解碼轉(zhuǎn)換成Python對象 從json到python的類型轉(zhuǎn)化對照如下:

      # json_loads.py

      import json

      strList = '[1, 2, 3, 4]'

      strDict = '{"city": "北京", "name": "大貓"}'

      json.loads(strList)

      # [1, 2, 3, 4]

      json.loads(strDict) # json數(shù)據(jù)自動(dòng)按Unicode存儲(chǔ)

      # {u'city': u'\u5317\u4eac', u'name': u'\u5927\u732b'}

      2. json.dumps()

      實(shí)現(xiàn)python類型轉(zhuǎn)化為json字符串,返回一個(gè)str對象 把一個(gè)Python對象編碼轉(zhuǎn)換成Json字符串

      從python原始類型向json類型的轉(zhuǎn)化對照如下:

      # json_dumps.py

      import json

      import chardet

      listStr = [1, 2, 3, 4]

      tupleStr = (1, 2, 3, 4)

      dictStr = {"city": "北京", "name": "大貓"}

      json.dumps(listStr)

      # '[1, 2, 3, 4]'

      json.dumps(tupleStr)

      # '[1, 2, 3, 4]'

      # 注意:json.dumps() 序列化時(shí)默認(rèn)使用的ascii編碼

      # 添加參數(shù) ensure_ascii=False 禁用ascii編碼,按utf-8編碼

      # chardet.detect()返回字典, 其中confidence是檢測精確度

      json.dumps(dictStr)

      # '{"city": "\u5317\u4eac", "name": "\u5927\u5218"}'

      chardet.detect(json.dumps(dictStr))

      # {'confidence': 1.0, 'encoding': 'ascii'}

      print json.dumps(dictStr, ensure_ascii=False)

      # {"city": "北京", "name": "大劉"}

      chardet.detect(json.dumps(dictStr, ensure_ascii=False))

      # {'confidence': 0.99, 'encoding': 'utf-8'}

      chardet是一個(gè)非常優(yōu)秀的編碼識(shí)別模塊,可通過pip安裝

      3. json.dump()

      將Python內(nèi)置類型序列化為json對象后寫入文件

      # json_dump.py

      import json

      listStr = [{"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形式的字符串元素 轉(zhuǎn)化成python類型

      # json_load.py

      import json

      strList = 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文檔中抽取指定信息的工具,提供多種語言實(shí)現(xiàn)版本,包括:Javascript, Python, PHP 和 Java。

      JsonPath 對于 JSON 來說,相當(dāng)于 XPATH 對于 XML。

      -:https://pypi.python.org/pypi/jsonpath

      安裝方法:點(diǎn)擊Download URL鏈接下載jsonpath,解壓之后執(zhí)行python setup.py install

      官方文檔:http://goessner.net/articles/JsonPath

      JsonPath與XPath語法對比:

      Json結(jié)構(gòu)清晰,可讀性高,復(fù)雜度低,非常容易匹配,下表中對應(yīng)了XPath的用法。

      示例:

      我們以拉勾網(wǎng)城市JSON文件?http://www.lagou.com/lbs/getAllCitySearchLabels.json?為例,獲取所有城市。

      # jsonpath_lagou.py

      import urllib2

      import jsonpath

      import json

      import chardet

      url = 'http://www.lagou.com/lbs/getAllCitySearchLabels.json'

      request =urllib2.Request(url)

      response = urllib2.urlopen(request)

      html = response.read()

      # 把json格式字符串轉(zhuǎn)換成python對象

      jsonobj = json.loads(html)

      # 從根節(jié)點(diǎn)開始,匹配name節(jié)點(diǎn)

      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()

      注意事項(xiàng):

      json.loads() 是把 Json格式字符串解碼轉(zhuǎn)換成Python對象,如果在json.loads的時(shí)候出錯(cuò),要注意被解碼的Json字符的編碼。

      如果傳入的字符串的編碼不是UTF-8的話,需要指定字符編碼的參數(shù)?encoding

      dataDict = json.loads(jsonStrGBK);

      dataJsonStr是JSON字符串,假設(shè)其編碼本身是非UTF-8的話而是GBK 的,那么上述代碼會(huì)導(dǎo)致出錯(cuò),改為對應(yīng)的:

      dataDict = json.loads(jsonStrGBK, encoding="GBK");

      如果 dataJsonStr通過encoding指定了合適的編碼,但是其中又包含了其他編碼的字符,則需要先去將dataJsonStr轉(zhuǎn)換為Unicode,然后再指定編碼格式調(diào)用json.loads()

      ``` python

      dataJsonStrUni = dataJsonStr.decode("GB2312"); dataDict = json.loads(dataJsonStrUni, encoding="GB2312");

      ##字符串編碼轉(zhuǎn)換

      這是中國程序員最苦逼的地方,什么亂碼之類的幾乎都是由漢字引起的。

      其實(shí)編碼問題很好搞定,只要記住一點(diǎn):

      ####任何平臺(tái)的任何編碼 都能和 Unicode 互相轉(zhuǎn)換

      UTF-8 與 GBK 互相轉(zhuǎn)換,那就先把UTF-8轉(zhuǎn)換成Unicode,再從Unicode轉(zhuǎn)換成GBK,反之同理。

      ``` python

      # 這是一個(gè) UTF-8 編碼的字符串

      Python:數(shù)據(jù)提取之JSON與JsonPATH

      utf8Str = "你好地球"

      # 1. 將 UTF-8 編碼的字符串 轉(zhuǎn)換成 Unicode 編碼

      unicodeStr = utf8Str.decode("UTF-8")

      # 2. 再將 Unicode 編碼格式字符串 轉(zhuǎn)換成 GBK 編碼

      gbkData = unicodeStr.encode("GBK")

      # 1. 再將 GBK 編碼格式字符串 轉(zhuǎn)化成 Unicode

      unicodeStr = gbkData.decode("gbk")

      # 2. 再將 Unicode 編碼格式字符串轉(zhuǎn)換成 UTF-8

      utf8Str = unicodeStr.encode("UTF-8")

      decode的作用是將其他編碼的字符串轉(zhuǎn)換成 Unicode 編碼

      encode的作用是將 Unicode 編碼轉(zhuǎn)換成其他編碼的字符串

      一句話:UTF-8是對Unicode字符集進(jìn)行編碼的一種編碼方式

      JSON Python

      版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。

      上一篇:文字識(shí)別在計(jì)算機(jī)視覺的重要性、基本技術(shù)和最新進(jìn)展(OCR系列一)
      下一篇:linux 定時(shí)任務(wù)(crontab)
      相關(guān)文章
      亚洲欧洲在线播放| 亚洲av无码不卡一区二区三区| 亚洲高清中文字幕| 亚洲春色在线视频| 亚洲精品午夜国产VA久久成人| 亚洲色无码一区二区三区| 国产av无码专区亚洲av果冻传媒| 精品亚洲一区二区三区在线观看 | 亚洲一区二区三区无码影院| 亚洲 另类 无码 在线| 国产精品亚洲а∨无码播放麻豆| 无码色偷偷亚洲国内自拍| 亚洲高清一区二区三区电影| 亚洲欧美国产欧美色欲| 久久亚洲精品11p| 四虎亚洲国产成人久久精品| 九月婷婷亚洲综合在线| 亚洲精品乱码久久久久久不卡| 亚洲精品动漫人成3d在线| 国产国拍精品亚洲AV片| 亚洲精品国产品国语在线| 亚洲av之男人的天堂网站| 亚洲日本中文字幕| 亚洲福利电影在线观看| 亚洲最大福利视频| 苍井空亚洲精品AA片在线播放 | 亚洲精品成人av在线| 亚洲资源在线视频| 亚洲人成影院77777| 亚洲日韩看片无码电影| 亚洲第一区精品日韩在线播放| 亚洲片国产一区一级在线观看 | 国产精品亚洲自在线播放页码| 亚洲日韩av无码中文| 国产亚洲精品美女久久久久久下载| 亚洲国产成人精品久久久国产成人一区二区三区综 | 亚洲电影在线播放| 亚洲人成77777在线观看网| 亚洲欧美综合精品成人导航| 亚洲国产成人久久一区WWW| 国产亚洲综合网曝门系列|