数据提取概述
认识xml以及html的区别?
xml: 可扩展标记语言 为了传输和存储数据,侧重点是在于数据内容本身
html: 超文本标记语言 为了更好的显示数据.侧重点是为了显示
常用的数据解析方法?
数据提取
正则表达式:描述了一种字符串匹配的模式.可以用来检查一个串是否含有某种子串.将匹配的子串做替换或者从某个串中取出某个条件的子串
模式:一种特定的字符串模式,这个模式是通过一些特殊符号组成的
功能:
- 数据验证
- 数据检索
- 数据隐藏
- 数据过滤
表达式语法
re模块
re.match模块
import re
if __name__ == '__main__':
""". 匹配任意字符"""
result = re.match('..','CEO')
if result != None:
print('匹配成功',result.group())
else:
print('匹配失败')
"""[]匹配[]中列举的一个字符"""
result = re.match('C[EFT]','CEO')
if result != None:
print('匹配成功',result.group())
else:
print('匹配失败')
"""\d 匹配数字,即0-9, \d等价于[0-9]"""
result = re.match('C\dO','C2O')
if result != None:
print('匹配成功',result.group())
else:
print('匹配失败')
"""\D 匹配非数字"""
result = re.match('C\DO','CEO')
if result != None:
print('匹配成功',result.group())
else:
print('匹配失败')
"""\s 匹配空白,即空格,tab键,换行"""
result = re.match('C\sO','C O')
result = re.match('C\sO','C\nO')
result = re.match('C\sO','C\tO')
if result != None:
print('匹配成功',result.group())
else:
print('匹配失败')
"""\S 匹配非空白"""
result = re.match('C\SO','CO')
if result != None:
print('匹配成功',result.group())
else:
print('匹配失败')
"""\w 匹配特殊字符"""
result = re.match('C\wO','C!O')
if result != None:
print('匹配成功',result.group())
else:
print('匹配失败')
"""\W 匹配特殊字符"""
result = re.match('C\WO', 'CEO')
if result != None:
print('匹配成功', result.group())
else:
print('匹配失败')
""" * 匹配前一个字符出现0次或者无限次,可有可无"""
result = re.match('[A-Z][a-z]*','Hello')
if result != None:
print('匹配成功', result.group())
else:
print('匹配失败')
""" + 匹配前一个字符出现1次或者无限次,至少有1次"""
result = re.match('[A-Z][a-z]+','Hi')
if result != None:
print('匹配成功', result.group())
else:
print('匹配失败')
""" ? 匹配前一个字符出现1次或者0次,要么有1次要么没有"""
result = re.match('https?','http')
if result != None:
print('匹配成功', result.group())
else:
print('匹配失败')
"""{m} 匹配前一个字符出现m次"""
result = re.match('[A-Za-z0-9_]{8}','sdafad1231')
if result != None:
print('匹配成功', result.group())
else:
print('匹配失败')
"""{m,n} 匹配前一个字符出现从m到n次"""
result = re.match('[A-Za-z0-9_]{8,20}','sdafad1231')
if result != None:
print('匹配成功', result.group())
else:
print('匹配失败')
"""{m,n} 匹配前一个字符出现至多m次"""
result = re.match('[A-Za-z0-9_]{,20}','sdafad1231')
if result != None:
print('匹配成功', result.group())
else:
print('匹配失败')
""" ^ 匹配字符串开头"""
result = re.match('^\d.*','110')
if result != None:
print('匹配成功', result.group())
else:
print('匹配失败')
""" $ 匹配字符串结尾"""
#需求: 必须是数字结尾
result = re.match('.*\d$','hello1')
if result != None:
print('匹配成功', result.group())
else:
print('匹配失败')
""" ^和$ 一起使用"""
result = re.match('^[1-9]\d{8}$','122345678')
if result != None:
print('匹配成功', result.group())
else:
print('匹配失败')
"""[^aeiou] : 取反 不包括aeiou的字符"""
result = re.match('[^aeiou]','a')
if result != None:
print('匹配成功', result.group())
else:
print('匹配失败')
#re.match方法默认使用的是贪婪匹配
#非贪婪匹配: .+? .*? 满足的字符越少越好
result = re.match('#.+?#','#幸福#是奋斗出来的')
if result:
print('匹配成功',result.group())
else:
print('匹配失败')
"""匹配11位手机号或者3到4位区号,7-8位电话"""
result = re.match("^1[3-9]\d{9}$ | ^0\d{2,3}-[^0]\d{6,7}$","021-1231312")
if result:
print('匹配成功',result.group())
else:
print('匹配失败')
"""(a,b)将括号中字符作为一个分组"""
#匹配出163,126,qq等邮箱
#\ 转义符 取消特殊意义
result = re.match('^([a-zA-Z0-9_]{3,})@(126 |163|qq)\.com','hello.163.com')
if result:
print('匹配成功',result.group())
else:
print('匹配失败')
jsonpath模块数据提取
import requests
import jsonpath
import json
# 获取拉勾网城市json字符串
url = 'http://www.lagou.com/lbs/getAllCitySearchLabels.json'
# 准备请求头
headers = {
"User-Agent": "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)"
}
# 发送请求
response =requests.get(url, headers=headers)
# 获取 json 响应数据,数据类型为:dict
json_dict = response.json()
# 从根节点开始,获取所有key为name的值
city_list = jsonpath.jsonpath(json_dict, '$..name')
# 写入文件
with open('city_name.txt','w', encoding='utf-8') as f:
f.write(str(city_list))
xpath-数据提取
浏览器安装插件 Xpath