结构化的数据是最好解决,个别都是相似JSON格局的字符串,间接解析JSON数据,提取JSON的关键字段即可。

JSON

JSON(JavaScript Object Notation) 是一种轻量级的数据交换格局;实用于进行数据交互的场景,比方网站前台与后盾之间的数据交互

Python 3.x中自带了JSON模块,间接import json就能够应用了。

Json模块提供了四个性能:dumps、dump、loads、load,用于字符串 和 python数据类型间进行转换

Python操作json的规范api库参考https://docs.python.org/zh-cn...://tool.oschina.net/codeformat/json

1. json.loads()

实现:json字符串 转化 python的类型,返回一个python的类型

从json到python的类型转化对照如下:

import jsona="[1,2,3,4]"b='{"k1":1,"k2":2}'#当字符串为字典时{}里面必须是''单引号{}外面必须是""双引号print json.loads(a) [1, 2, 3, 4]print json.loads(b) {'k2': 2, 'k1': 1}

案例

获取豆瓣电影热门

import urllib.parseimport urllib.requestimport jsonurl='https://movie.douban.com/j/search_subjects?type=movie&tag=%E7%83%AD%E9%97%A8&page_limit=50&page_start=0'# 豆瓣最新 热门herders={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.102 Safari/537.36', 'Referer':'https://movie.douban.com','Connection':'keep-alive'}# 申请头信息req = urllib.request.Request(url,headers=herders)# 设置申请头response=urllib.request.urlopen(req)# 发动申请,失去response响应hjson = json.loads(response.read())# json转换为字典# 遍历字典中的电影,item是每条电影信息for item in hjson["subjects"]:    print(item["rate"],item["title"])    # 打印每条电影的评分与题目

输入

6.9 神弃之地7.2 从邪恶中援救我6.1 福尔摩斯小姐:失踪的侯爵6.2 夺命隧道6.3 OK老板娘7.3 我想完结这所有8.3 鸣鸟不飞:乌云密布7.7 1/2的魔法7.8 树上有个好中央6.3 妙学生5.1 釜山行2:半岛...

2. json.dumps()

实现python类型转化为json字符串,返回一个str对象

从python原始类型向json类型的转化对照如下:

import jsona = [1,2,3,4]b ={"k1":1,"k2":2}c = (1,2,3,4)json.dumps(a)'[1, 2, 3, 4]'json.dumps(b)'{"k2": 2, "k1": 1}'json.dumps(c)'[1, 2, 3, 4]'

json.dumps 中文编码问题

如果Python Dict字典含有中文,json.dumps 序列化时对中文默认应用的ascii编码

import chardetimport jsonb = {"name":"中国"}json.dumps(b)'{"name": "\\u4e2d\\u56fd"}'print json.dumps(b){"name": "\u4e2d\u56fd"}chardet.detect(json.dumps(b)){'confidence': 1.0, 'encoding': 'ascii'}

'中国' 中的ascii 字符码,而不是真正的中文。

想输入真正的中文须要指定ensure_ascii=False

json.dumps(b,ensure_ascii=False)'{"name": "\xe6\x88\x91"}'print json.dumps(b,ensure_ascii=False) {"name": "我"}chardet.detect(json.dumps(b,ensure_ascii=False)){'confidence': 0.7525, 'encoding': 'utf-8'}

3. json.dump()

import jsona = [1,2,3,4]json.dump(a,open("digital.json","w"))b = {"name":"我"}json.dump(b,open("name.json","w"),ensure_ascii=False)json.dump(b,open("name2.json","w"),ensure_ascii=True)

4. json.load()

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

import jsonnumber = json.load(open("digital.json"))print( number)b = json.load(open("name.json"))print( b)b.keys()print b['name']

</pre>

实战我的项目

获取 lagou 城市表信息

import urllib.parseimport urllib.requestimport jsonurl='http://www.lagou.com/lbs/getAllCitySearchLabels.json?'# 拉钩城市列表herders={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.102 Safari/537.36', 'Referer':'http://www.lagou.com','Connection':'keep-alive'}# 申请头信息req = urllib.request.Request(url,headers=herders)# 设置申请头response=urllib.request.urlopen(req)# 发动申请,失去response响应hjson = json.loads(response.read())# print(hjson)# json转换为字典# 遍历字典中A结尾的城市列表for item in hjson["content"]["data"]["allCitySearchLabels"]["A"]:    print(item["name"],item["code"])    # 打印A 结尾的城市革除与代码

输入:

安阳 171500000安庆 131800000鞍山 081600000安顺 240400000健康 270400000阿克苏 311800000阿拉善盟 070300000阿勒泰 310400000阿坝藏族羌族自治州 230700000

JSONPath

JSON 信息抽取类库,从JSON文档中抽取指定信息的工具

JSONPath与Xpath区别

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

下载地址:

https://pypi.python.org/pypi/...

装置办法:pip install jsonpath

参考文档

XPathJSONPathResult
/store/book/author$.store.book[*].author*获取所有store中的book的author
//author$..author获取所有 authors
/store/$.store.all things in store, which are some books and a red bicycle.
/store//price$.store..price获取store中所有的price
//book[3]$..book[2]第二个 book
//book[last()]$..book[(@.length-1)]`$..book[-1:]`获取到最初一个book
//book[position()<3]$..book[0,1]`$..book[:2]`获取到前两个 books
//book[isbn]$..book[?(@.isbn)]获取到有isbn属性的book
//book[price<10]$..book[?(@.price<10)]获取所有的book ,price小于10
//$..*匹配任意元素

案例

还是以 http://www.lagou.com/lbs/getA... 为例,获取所有城市

import urllib.requestimport jsonimport jsonpathurl='http://www.lagou.com/lbs/getAllCitySearchLabels.json'# 拉钩城市列表herders={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.102 Safari/537.36', 'Referer':'http://www.lagou.com','Connection':'keep-alive'}# 申请头信息req = urllib.request.Request(url,headers=herders)# 设置申请头response=urllib.request.urlopen(req)# 发动申请,失去response响应hjson = json.loads(response.read())# 将字符加载为json对象citylist = jsonpath.jsonpath(hjson,'$..name')# 获取到所有的 城市名称# print (type(citylist)) # <class 'list'>content = json.dumps(citylist,ensure_ascii=False)# 列表转换为json 字符串 ,不应用ascii编码,fp = open('city.json','w')# 关上文件fp.write(content)# 写入文件fp.close()# 敞开文件

输入文件为

XML

xmltodict模块让应用XML感觉跟操作JSON一样

Python操作XML的第三方库参考:

https://github.com/martinblec...

模块装置:

pip install xmltodict
import xmltodictbookdict = xmltodict.parse("""        <bookstore>            <book>                  <title lang="eng">Harry Potter</title>                  <price>29.99</price>            </book>            <book>                  <title lang="eng">Learning XML</title>                  <price>39.95</price>            </book>    </bookstore>    """)print (bookdict.keys())[u'bookstore']print(json.dumps(bookdict,indent=4))

输入后果:

{    "bookstore": {        "book": [            {                "title": {                    "@lang": "eng",                     "#text": "Harry Potter"                },                 "price": "29.99"            },             {                "title": {                    "@lang": "eng",                     "#text": "Learning XML"                },                 "price": "39.95"            }        ]    }}

单词表

"""单词表 content         内容loads           加载dumps           输入 (倾倒)citylist        城市列表JSON(JavaScript Object Notation)( JS 对象对象表述数据)path            门路request         申请headers         头信息response        响应read            读取content         内容"""

数据提取总结

  • HTML、XML
  XPath  CSS选择器  正则表达式
  • JSON
JSONPath转化成Python类型进行操作(json类)
  • XML
转化成Python类型(xmltodict)  XPath  CSS选择器  正则表达式
  • 其余(js、文本、电话号码、邮箱地址)
正则表达式

在线练习:https://www.520mg.com/it