python遞迴解析JSON

2021-09-28 01:04:52 字數 3741 閱讀 1718

知識點:

1、編碼設定、特殊字元處理

2、正規表示式提取json字串

3、遞迴列印json屬性值

#!/usr/bin/python

# -*- coding: utf-8 -*-

import os, sys, time

import urllib.request, requests, bs4

import re, json, demjson

import importlib

# 設定utf-8編碼

importlib.

reload

(sys)

# 特殊字元處理

non_bmp_map =

dict

.fromkeys(

range

(0x10000

, sys.maxunicode +1)

,0xfffd

)'''

斷點列印

'''def

dump

(msg)

:print

(msg)

os._exit(0)

'''解析jsonp格式為json

'''def

loads_jsonp

(jsonp)

:#jsonp = 'jsonp1()'

return json.loads(re.match(

".*?().*"

,str

(jsonp)

, re.s)

.group(1)

)'''

'''def

downfiles

(imglist)

:#fname = time.strftime("%y%m%d%h%m%s", time.localtime()) # 日期命名

x =0# 遍歷

for imgurl in imglist:

# 獲取獲得的從imglist中遍歷得到的imgurl

("第"

, x ,

"張")

print()

'''讀取詳情頁

'''def

getdetails

(url)

: res = requests.get(url)

downloadedlist =

res.raise_for_status(

) html = bs4.beautifulsoup(res.text,

'html5lib'

) data = html.select(

'.reveal-work-wrap > img'

)# 返回陣列

for path in data:

target = path.get(

'src'

)# 返回src屬性

target = target.split(

'@')[0

]# 路徑處理

# 加入全域性陣列

print

(target)

downfiles(downloadedlist)

'''獲取頁面原始碼

'''def

geturl

(url)

: res = requests.get(url)

res.raise_for_status(

) html = bs4.beautifulsoup(res.text,

'html5lib'

)return html

'''解析json,僅一層

'''def

printjson

(json)

: obj = demjson.decode(json)

for name in obj:

print

(name,

':', obj[name]

)'''

遞迴解析json

'''def

dict_generator

(indict, pre=

none):

pre = pre[:]

if pre else

ifisinstance

(indict,

dict):

for key, value in indict.items():

ifisinstance

(value,

dict):

iflen

(value)==0

:yield pre+

[key,

'{}'

]else

:for d in dict_generator(value, pre +

[key]):

yield d

elif

isinstance

(value,

list):

iflen

(value)==0

:yield pre+

[key,'']

else

:for v in value:

for d in dict_generator(v, pre +

[key]):

yield d

elif

isinstance

(value,

tuple):

iflen

(value)==0

:yield pre+

[key,

'()'

]else

:for v in value:

for d in dict_generator(v, pre +

[key]):

yield d

else

:yield pre +

[key, value]

else

:yield indict

'''列印目標型別

'''def

typeof

(target)

:print

(type

(target)

)#jsonp = 'jsonp1()'

jsonp = geturl(

'')result = re.match(r'.*?().*'

,str

(jsonp)

, re.s)

.group(1)

# 利用遞迴解析json

result = result.translate(non_bmp_map)

#特殊字元處理

svalue = json.loads(result)

for i in dict_generator(svalue)

:print

('.'

.join(i[0:

-1])

,':'

, i[-1

])os._exit(

0)

遞迴解析Json字串

json.parsearray string 將json字串解析為jsonarray物件 parseobject string 將json字串解析為jsonobject物件 jsonobject繼承json,所以json有的方法,jsonobject也有。json的優點 可以像map一樣取資料,可以...

python 解析多層json

原始檔案內容 channels 3 height 1080 width 1920 修改並儲存 coding utf 8 import os import json 獲取目標資料夾的路徑 filedir r j numberdata mrcnnhik test 獲取資料夾中的檔名稱列表 filenam...

Python解析JSON詳解

json 函式 使用 json 函式需要匯入 json 庫 import json。函式 描述 json.dumps 將 python 物件編碼成 json 字串 json.loads 將已編碼的 json 字串解碼為 python 物件 json.dumps 語法 json.dumps obj,s...