成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

如何使用python提取JSON數(shù)據(jù)指定內(nèi)容

89542767 / 1449人閱讀

  python作為一種比較常見的編程語言,其應(yīng)用的范圍還是比較的廣泛的,主要講解的內(nèi)容是如何使用python提取JSON數(shù)據(jù)指定內(nèi)容,需要我們好好的去進(jìn)行一個實(shí)操。那么,怎么樣快速的才能夠上手這項(xiàng)技能呢?下面小編給大家詳細(xì)解答下。


  如何提取JSON數(shù)據(jù)指定內(nèi)容


  假設(shè)我們要獲取'pic_str'里的數(shù)據(jù)


  JSON數(shù)據(jù)

  {'err_no':0,'err_str':'OK','pic_id':'1169213517976400008','pic_str':'xoet','md5':'ca9bc4fda521498d2b3aba5dbb4ee4ac'}


  1、JSON數(shù)據(jù)為字符串類型


  import json
  str="{'err_no':0,'err_str':'OK','pic_id':'1169213517976400008','pic_str':'xoet','md5':'ca9bc4fda521498d2b3aba5dbb4ee4ac'}"
  json_str=str.replace("'",'"')
  #json.loads(),要求json串格式中必須的雙引號??!轉(zhuǎn)換為字典
  json_dict=json.loads(dict2)
  print(json_dict['pic_str'])
  >>xoet


  2、JSON數(shù)據(jù)為字典類型


  import json
  json_dict={'err_no':0,'err_str':'OK','pic_id':'1169213517976400008','pic_str':'xoet','md5':'ca9bc4fda521498d2b3aba5dbb4ee4ac'}
  #方法一
  print(json_dict['pic_str'])
  #或者使用print(json_dict.get('pic_str'))
  #方法二:遍歷
  for pic in json_dict['pic_str'}:
  print(pic)


  如何提取復(fù)雜JSON的數(shù)據(jù)


  在越來越多的項(xiàng)目中,基本都用了json作為接口數(shù)據(jù)返回的格式。json給我們的感覺就是通俗易懂,只是即使再復(fù)雜的結(jié)構(gòu)也會比其他格式容易看。然而一旦在調(diào)試或者測試中需要用到提取某一部分字段數(shù)據(jù)進(jìn)行解析并校驗(yàn)的話,就沒那么容易了。這篇文章使用python簡單地獲取到復(fù)雜json數(shù)據(jù)中的字段信息。


  例子


  如果有一個接口返回的json信息如下:


  {
  "familyName":"thinker family",
  "homeTown":"廣東省",
  "formed":2016,
  "secretBase":"Super city",
  "active":true,
  "familyMembers":[
  {
  "name":"Jobs",
  "age":35,
  "secretIdentity":"1992238132345",
  "powers":[
  "Radiation resistance",
  "Turning tiny",
  "Radiation blast"
  ]
  },
  {
  "name":"James",
  "age":37,
  "secretIdentity":"8839394098124",
  "powers":[
  "Million tonne punch",
  "Damage resistance",
  "Superhuman reflexes"
  ]
  }
  ]
  }


  這里就包含了對象,以及列表數(shù)據(jù)。對象中也包含列表數(shù)據(jù)。這應(yīng)該是最基本的企業(yè)接口json格式了。


  假如你要提取json中的name信息,最簡單的方式就是


  member=[members.get('name')for members in data.get('familyMembers')]

  如果是要連續(xù)拿其他的信息,那么就需要換其他中獲取方式,其實(shí)這種是比較麻煩的一種方法。


  解決方法


  extract_element_from_json(data,["familyMembers","name"])
  >>['Jobs','James']


  此函數(shù)根據(jù)path中指定的鍵嵌套到obj中的記錄中以檢索所需的信息。當(dāng)遇到一個列表作為path中鍵的值時,此函數(shù)會拆分并以深度優(yōu)先的方式繼續(xù)嵌套在遇到的列表的每個元素上。這就是返回['Jobs','James']的方式;因?yàn)閒amilyMembers的值是一個列表,所以嵌套在它的兩個元素上被拆分,并且name的每個值都附加到輸出列表中。


  如果obj是單個字典/json,則此函數(shù)返回包含所需信息的列表,如果obj是字典/json列表,則此函數(shù)返回包含所需信息的雙重列表。


  如果嵌套字典/json的相應(yīng)級別缺少path的元素,則此函數(shù)返回[None]。


  完整代碼如下:


  def extract_element_from_json(obj,path):
  '''
  輸入關(guān)鍵字,就可以將關(guān)鍵字的值信息存放在列表中并輸出
  如果關(guān)鍵字是對象名,則返回的對象字典信息到列表中
  如果關(guān)鍵字是列表名,則返回的列表信息到列表中(返回雙重列表)
  '''
  def extract(obj,path,ind,arr):
  '''
  從一個嵌套的字典中提取一個元素,并返回到列表中。
  params:obj-dict-輸入字典
  params:path-list-構(gòu)成JSON路徑的字符串列表
  params:ind-int-起始索引
  params:arr-列表-輸出列表
  '''
  key=path[ind]
  if ind+1<len(path):
  if isinstance(obj,dict):
  if key in obj.keys():
  extract(obj.get(key),path,ind+1,arr)
  else:
  arr.append(None)
  elif isinstance(obj,list):
  if not obj:
  arr.append(None)
  else:
  for item in obj:
  extract(item,path,ind,arr)
  else:
  arr.append(None)
  if ind+1==len(path):
  if isinstance(obj,list):
  if not obj:
  arr.append(None)
  else:
  for item in obj:
  arr.append(item.get(key,None))
  elif isinstance(obj,dict):
  arr.append(obj.get(key,None))
  else:
  arr.append(None)
  return arr
  if isinstance(obj,dict):
  return extract(obj,path,0,[])
  elif isinstance(obj,list):
  outer_arr=[]
  for item in obj:
  outer_arr.append(extract(item,path,0,[]))
  return outer_arr

  這段代碼可以直接復(fù)制使用。


  其中使用方法很簡單如下:

  extract_element_from_json(data,["familyMembers","name"])


  api提取元素


  import requests
  url="http://ip-api.com/json"
  response=requests.request("GET",url)
  data=response.json()
  extract_element_from_json(data,["status"])


  就是這么簡單地使用了。


  應(yīng)用場景


  通過這樣的方式可以在什么場景下使用呢?


  接口重構(gòu),需要校驗(yàn)接口中的部分字段數(shù)據(jù)


  接口新增字段,只針對新增的字段進(jìn)行提取校驗(yàn)


  需要提取某一部分字段進(jìn)行數(shù)據(jù)傳遞


  這篇文章就給大家介紹到這里了,希望可以給大家?guī)韼椭?/p>

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/128294.html

相關(guān)文章

  • Python爬蟲筆記5-JSON格式數(shù)據(jù)提取和保存

    摘要:如下運(yùn)行結(jié)果小黑此外,如果需要將數(shù)據(jù)保存為文本的時候,還需要指定文件的編碼格式為,比如將上面的數(shù)據(jù)里面有中文字符保存為文件,代碼如下否則打開保存的文件,會有亂碼。 環(huán)境:python-3.6.5 JSON JSON(JavaScript Object Notation) 是一種輕量級的數(shù)據(jù)交換格式,它使得人們很容易的進(jìn)行閱讀和編寫。同時也方便了機(jī)器進(jìn)行解析和生成。適用于進(jìn)行數(shù)據(jù)交互的場...

    ztyzz 評論0 收藏0
  • Python3網(wǎng)絡(luò)爬蟲實(shí)戰(zhàn)---31、數(shù)據(jù)存儲:文件存儲

    摘要:如果該文件已存在,文件指針將會放在文件的結(jié)尾。運(yùn)行結(jié)果以上是讀取文件的方法。為了輸出中文,我們還需要指定一個參數(shù)為,另外規(guī)定文件輸出的編碼。 上一篇文章:Python3網(wǎng)絡(luò)爬蟲實(shí)戰(zhàn)---30、解析庫的使用:PyQuery下一篇文章:Python3網(wǎng)絡(luò)爬蟲實(shí)戰(zhàn)---32、數(shù)據(jù)存儲:關(guān)系型數(shù)據(jù)庫存儲:MySQL 我們用解析器解析出數(shù)據(jù)之后,接下來的一步就是對數(shù)據(jù)進(jìn)行存儲了,保存的形式可以...

    dreamans 評論0 收藏0
  • 另類爬蟲:從PDF文件中爬取表格數(shù)據(jù)

    摘要:本文將展示如何利用的模塊從文件中爬取表格數(shù)據(jù)。但如何從文件中提取其中的表格,這卻是一個大難題。我們以輸出文件為例從文件中提取表格將表格數(shù)據(jù)轉(zhuǎn)化為文件得到的文件如下例在例中,我們將提取頁面中的某一區(qū)域的表格的數(shù)據(jù)。 簡介 ??本文將展示一個稍微不一樣點(diǎn)的爬蟲。??以往我們的爬蟲都是從網(wǎng)絡(luò)上爬取數(shù)據(jù),因?yàn)榫W(wǎng)頁一般用HTML,CSS,JavaScript代碼寫成,因此,有大量成熟的技術(shù)來爬取...

    Anchorer 評論0 收藏0
  • Python爬蟲學(xué)習(xí)路線

    摘要:以下這些項(xiàng)目,你拿來學(xué)習(xí)學(xué)習(xí)練練手。當(dāng)你每個步驟都能做到很優(yōu)秀的時候,你應(yīng)該考慮如何組合這四個步驟,使你的爬蟲達(dá)到效率最高,也就是所謂的爬蟲策略問題,爬蟲策略學(xué)習(xí)不是一朝一夕的事情,建議多看看一些比較優(yōu)秀的爬蟲的設(shè)計(jì)方案,比如說。 (一)如何學(xué)習(xí)Python 學(xué)習(xí)Python大致可以分為以下幾個階段: 1.剛上手的時候肯定是先過一遍Python最基本的知識,比如說:變量、數(shù)據(jù)結(jié)構(gòu)、語法...

    liaoyg8023 評論0 收藏0
  • python---網(wǎng)絡(luò)基礎(chǔ)(socket)

    摘要:套接字有兩種或者稱為有兩個種族分別是基于文件型的和基于網(wǎng)絡(luò)型的。大部分網(wǎng)絡(luò)設(shè)備的都是。不會發(fā)生黏包,用戶數(shù)據(jù)報協(xié)議是無連接的,面向消息的,提供高效率服務(wù)。即面向消息的通信是有消息保護(hù)邊界的。 軟件開發(fā)的架構(gòu) 我們了解的涉及到兩個程序之間通訊的應(yīng)用大致可以分為兩種: 第一種是應(yīng)用類:qq、微信、網(wǎng)盤、優(yōu)酷這一類是屬于需要安裝的桌面應(yīng)用 第二種是web類:比如百度、知乎、博客園等使用瀏覽器...

    Dr_Noooo 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<