网络爬虫之网页数据解析(JSON与JsonPATH)

JSON
定义
  • JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,它使得人们很容易的进行阅读和编写。同时也方便了机器进行解析和生成。适用于进行数据交互的场景,比如网站前台与后台之间的数据交互。
  • JSON和XML的比较可谓不相上下。
对象{}:JSONObject
  • 对象:对象在js中表示为{ }括起来的内容,数据结构为 { key:value, key:value, … }的键值对的结构,在面向对象的语言中,key为对象的属性,value为对应的属性值,所以很容易理解,取值方法为 对象.key 获取属性值,这个属性值的类型可以是数字、字符串、数组、对象这几种。
数组[]:JSONArray
  • 数组:数组在js中是中括号[ ]括起来的内容,数据结构为 [“Python”, “javascript”, “C++”, …],取值方式和所有语言中一样,使用索引获取,字段值的类型可以是 数字、字符串、数组、对象几种。
方法
  • load打开文件

    # 读取文件中json形式的字符串元素 转化成python类型
    
    obj = json.load(open('book.json', 'r', encoding='utf-8'))
    print(type(obj)
    
  • loads字符串

    # 把Json格式字符串解码转换成Python对象
    # 从json到python的类型转化对照如图所示
    
    with open('./book.json',mode='r',encoding='utf-8') as f:
        json_string = f.read()
    # 将json格式字符串转化为对象
    obj = json.loads(json_string)
    print(type(obj))
    
  • string串

    str = '''{"has_more": false, "message": "success", "data": [{"single_mode": true, "abstract": "\u8c22\u8c22\u5927\u5bb6\u559c\u6b22\u6bcf\u65e5\u64b8"}]}'''
    
  • dumps

    # 实现python类型转化为json字符串,返回一个str对象 把一个Python对象编码转换成Json字符串
    # 从python原始类型向json类型的转化对照
    
    import json
    str = '''{"has_more": false, "message": "success", "data": [{"single_mode": true, "abstract": "\u8c22\u8c22\u5927\u5bb6\u559c\u6b22\u6bcf\u65e5\u64b8"}]}'''
    
    print(type(str))
    print(json.dumps(str,ensure_ascii=False))
    
  • dump

    # 将Python内置类型序列化为json对象后写入文件
    
    import json
    
    dictStr = {"city": "北京", "name": "大刘",'info':'\u8c22\u8c22\u5927'}
    # Serialize ``obj`` as a JSON formatted stream to ``fp
    json.dump(dictStr, open("dictStr.json","w",encoding='utf-8'), ensure_ascii=False,)
    
JSON与Python数据类型对戏
JSONPython
objectdict
arraylist、tuple
stringUnicode
number(int)int、long
number(real)float
trueTrue
falseFalse
nullNone
JsonPath
定义
  • JsonPath 是一种信息抽取类库,是从JSON文档中抽取指定信息的工具,提供多种语言实现版本,包括:Javascript, Python, PHP 和 Java。

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

JsonPath和XPath的语法对比
XPathJsonPath描述
/$根节点
.@现节点
/. or []取子节点
取父节点,JsonPath未支持
//选取所有位置所有符合条件的条件
**匹配所有元素节点
@根据属性访问,Json不支持,因为Json是个key-value递归结构,不需要
[][]迭代器标识(可以在里面做简单的迭代操作,如数组下标,根据内容选值等)
|[,]支持迭代中做多选
[]?()支持过滤操作
()支持表达式计算
()分组,JsonPath不支持

语法实例对比

XPathJsonPath结果
/store/book/author$.store.book[*].author书店所有书的作者
//author$…author所有的作者
//store/*$.store.*store的所有元素。所有的book和bicycle
/store//price$.store…pricestore里面所有东西的price
//book[3]$…book[2]第三本书
//book[last()]$…book[(@.length-1)]最后一本书
//book[position()< 3]s…book[0,1] or s…book[:2]前面的两本书
//book[isbn]$…book[?(@.isbn)]过滤出所有的包含isbn的书
//book[price<10]$…book[?(@.price<10)]过滤出价格低于10 的书
//*$…*所有元素
JsonPath的基本使用
import json
# xpath
# pip install jsonpath 专门解析json类型的数据
import jsonpath
import requests

# s = '''{"key":"Hello","dict":"World"}'''
# print(type(s))
# json_obj = json.loads(s,encoding='utf-8')
# print(json_obj)
# print(type(json_obj))
# print(json_obj['key'])
url = 'https://www.lagou.com/lbs/getAllCitySearchLabels.json'
if __name__ == '__main__':
    headers = {
        'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3',
        'Accept-Encoding': 'gzip, deflate, br',
        'Accept-Language': 'zh-CN,zh;q=0.9',
        'Cache-Control': 'max-age=0',
        'Connection': 'keep-alive',
        'Cookie': 'user_trace_token=20170911115921-976c1ee9-96a5-11e7-8e78-525400f775ce; LGUID=20170911115921-976c23ed-96a5-11e7-8e78-525400f775ce; _ga=GA1.2.999441537.1505102359; sensorsdata2015jssdkcross=%7B%22distinct_id%22%3A%221680c0e7fe84b5-09d8e2e6bf1c25-5e442e19-1327104-1680c0e7fe9c9%22%2C%22%24device_id%22%3A%221680c0e7fe84b5-09d8e2e6bf1c25-5e442e19-1327104-1680c0e7fe9c9%22%2C%22props%22%3A%7B%22%24latest_traffic_source_type%22%3A%22%E7%9B%B4%E6%8E%A5%E6%B5%81%E9%87%8F%22%2C%22%24latest_referrer%22%3A%22%22%2C%22%24latest_referrer_host%22%3A%22%22%2C%22%24latest_search_keyword%22%3A%22%E6%9C%AA%E5%8F%96%E5%88%B0%E5%80%BC_%E7%9B%B4%E6%8E%A5%E6%89%93%E5%BC%80%22%2C%22%24latest_utm_source%22%3A%22m_cf_cpc_baidu_pc%22%7D%7D; LG_HAS_LOGIN=1; gate_login_token=8586a02d54456365d23dc7b47a95ba949ed3cf351688cd37; LG_LOGIN_USER_ID=410cde6b7ecf76cb8f5c12869d780fb3c721f5b00f5a1a87; showExpriedIndex=1; showExpriedCompanyHome=1; showExpriedMyPublish=1; hasDeliver=2; index_location_city=%E5%8C%97%E4%BA%AC; privacyPolicyPopup=false; Hm_lvt_4233e74dff0ae5bd0a3d81c6ccf756e6=1571903416,1571970618,1572354935; _gid=GA1.2.387582430.1572354935; JSESSIONID=ABAAABAAAIAACBI3C82CE49769577D6151513758B1646B9',
        'Host': 'www.lagou.com',
        'Sec-Fetch-Mode': 'navigate',
        'Sec-Fetch-Site': 'none',
        'Sec-Fetch-User': '?1',
        'Upgrade-Insecure-Requests': '1',
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36', }

    # response = requests.get(url=url, headers=headers)
    # data = response.text
    # json_obj = json.loads(data,encoding='utf-8')
    # print(json_obj['content']['data']['allCitySearchLabels']['B'][0]['name'])
    # result = jsonpath.jsonpath(json_obj,'$..[name,id,code]')
    # print(result)
    # # 返回列表,只有一个数据
    # # data = jsonpath.jsonpath(json_obj,'$.content[data]')
    # data = jsonpath.jsonpath(json_obj,'$.content.data')
    # print(data)
    # print(len(data))

    data = '''{ "store": {
    "book": [ 
      { "category": "reference",
        "author": "李白",
        "title": "Sayings of the Century",
        "price": 8.95
      },
      { "category": "fiction",
        "author": "杜甫",
        "title": "Sword of Honour",
        "price": 12.99
      },
      { "category": "fiction",
        "author": "白居易",
        "title": "Moby Dick",
        "isbn": "0-553-21311-3",
        "price": 8.99
      },
      { "category": "fiction",
        "author": "苏轼",
        "title": "The Lord of the Rings",
        "isbn": "0-395-19395-8",
        "price": 22.99
      }
    ],
    "bicycle": {
      "color": "red",
      "price": 19.95
    }
  }
}'''
    json_obj = json.loads(data, encoding='utf-8')

    # print(jsonpath.jsonpath(json_obj,'$.store.book[*].author'))
    # print(jsonpath.jsonpath(json_obj,'$..author'))
    # print(jsonpath.jsonpath(json_obj,'$.store.book[?(@.price>12)]'))
    # jsonpath 索引从0开始的
    # print(jsonpath.jsonpath(json_obj,'$.store.book[0]'))
    # @当前,当前列表长度 - 1 最后一个对象
    # print(jsonpath.jsonpath(json_obj,'$.store.book[(@.length -1)]'))
    print(jsonpath.jsonpath(json_obj, '$.store.book[?(@.isbn)]'))

实例
  • 示例一拉勾城市数据

    # 拉勾网城市JSON文件 http://www.lagou.com/lbs/getAllCitySearchLabels.json 为例,获取所有城市
    
    import requests
    import jsonpath
    import json
    
    url = 'https://www.lagou.com/lbs/getAllCitySearchLabels.json/'
    response = requests.get(url,verify = False)
    html = response.text
    
    # 把json格式字符串转换成python对象
    jsonobj = json.loads(html)
    
    # 从根节点开始,匹配name节点
    citylist = jsonpath.jsonpath(jsonobj,'$..name')
    
    # 把一个Python对象编码转换成Json字符串
    content = json.dumps(citylist, ensure_ascii=False)
    
    with open('city.json','wb') as f:
        f.write(content.encode('utf-8'))
    
    • cities = jsonpath.jsonpath(obj,’$…[name,id,code]’)
    • content = jsonpath.jsonpath(obj,’$.content[data]’)
  • 示例二图书json数据

    import json
    import jsonpath
    
    obj = json.load(open('book.json', 'r', encoding='utf-8'))
    print(type(obj))
    
    # 通过如下函数使用jsonpath
    # 参数1:json对象,参数2:jsonpath
    # $ 代表的是根节点
    # . 就类似于xpath里面的 /
    # 【路径含义】从根开始一步一步找到指定书本的作者,如果写*代表所有的book,写下标代表的是指定book,注意,下标从0开始,查找所有book的作者,必须写*
    ret = jsonpath.jsonpath(obj, '$.store.book[*].author')
    ret = jsonpath.jsonpath(obj, '$..author')
    ret = jsonpath.jsonpath(obj, '$.store..price')
    # 查找最后一本书
    ret = jsonpath.jsonpath(obj, '$..book[(@.length-1)]')
    ret = jsonpath.jsonpath(obj, '$..book[:2]')
    print(ret)
    
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
解析网页中的JSON数据,可以使用Pythonjson模块。首先,你需要导入json模块。然后,使用urllib.request模块获取网页的内容,并将其存储在一个变量中。接下来,使用json.loads()函数将获取到的内容解析JSON格式的数据。最后,你可以对解析后的数据进行操作和处理。 下面是一个示例代码,演示了如何使用Python爬虫解析网页中的JSON数据: ```python import json import urllib.request url = "http://example.com/data.json" # 替换为你要解析网页URL response = urllib.request.urlopen(url) data = response.read().decode("utf-8") json_data = json.loads(data) # 现在你可以对json_data进行操作和处理了 # 例如,获取其中的某个字段的值 value = json_data\["key"\] print(value) ``` 在这个示例中,我们首先导入了json和urllib.request模块。然后,我们使用urllib.request.urlopen()函数获取网页的内容,并将其存储在变量response中。接下来,我们使用response.read()方法读取内容,并使用decode("utf-8")将其解码为字符串。最后,我们使用json.loads()函数将字符串解析JSON格式的数据,并将其存储在变量json_data中。你可以根据需要对json_data进行操作和处理。 请注意,示例中的URL是一个示例URL,你需要将其替换为你要解析网页的URL。另外,如果网页的编码方式不是UTF-8,你需要相应地修改decode()函数的参数。 希望这个示例能帮助你理解如何使用Python爬虫解析网页中的JSON数据。如果你有任何进一步的问题,请随时提问。 #### 引用[.reference_title] - *1* [Python爬虫——使用JSON解析JSON数据](https://blog.csdn.net/baidu_39514357/article/details/125046948)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [[Python]爬虫,正则表达式解析网页Json序列化](https://blog.csdn.net/u012741077/article/details/51534890)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值