python有五大解析器
一、正则表达式 ,使用第三方库 re(re)
1.匹配规则有
模式 | 描述 |
---|---|
| 匹配字母、数字及下划线 |
| 匹配不是字母、数字及下划线的字符 |
| 匹配任意空白字符,等价于 |
| 匹配任意非空字符 |
| 匹配任意数字,等价于 |
| 匹配任意非数字的字符 |
| 匹配字符串开头 |
| 匹配字符串结尾,如果存在换行,只匹配到换行前的结束字符串 |
| 匹配字符串结尾,如果存在换行,同时还会匹配换行符 |
| 匹配最后匹配完成的位置 |
| 匹配一个换行符 |
| 匹配一个制表符 |
| 匹配一行字符串的开头 |
| 匹配一行字符串的结尾 |
| 匹配任意字符,除了换行符,当 |
| 用来表示一组字符,单独列出,比如 |
| 不在 |
| 匹配0个或多个表达式 |
| 匹配1个或多个表达式 |
| 匹配0个或1个前面的正则表达式定义的片段,非贪婪方式 |
| 精确匹配 |
| 匹配 |
| 匹配 |
| 匹配括号内的表达式,也表示一个组 |
2.方法:
(1)match() 从头开始匹配 match('规则',html,re.S)
(2)search() 扫描整个字符串,可不从头匹配 ,但只匹配到第一个符合规则的,search('规则',html,re.S)
(3) findall() 扫描整个字符串,可不从头匹配 ,匹配到所有符合规则的 findall('规则',html,re.S)
(4) sub() 替换/去除某些元素 sub.('规则',要去替换的元素,html)
(5) compile() 将正则表达式编译成正则表达式对象,以便后面匹配中复用 compile(规则)
小例:
import requests
import re
res = requests.get(url)
id = re.findall('<p>(.*?)</p>',res.text,re.S)
项目实战:https://mp.csdn.net/postedit/83478140
具体知识请浏览 https://blog.csdn.net/huang1600301017/article/details/83418871
或 https://cuiqingcai.com/5530.html
二、xpath,使用第三方库 from lxml import etree
1. XPath常用规则
(1)列举了XPath的几个常用规则。
XPath常用规则
表达式 | 描述 |
---|---|
| 选取此节点的所有子节点 |
| 从当前节点选取直接子节点 |
| 从当前节点选取子孙节点 |
| 选取当前节点 |
| 选取当前节点的父节点 |
| 选取属性 |
(2) 方法
etree.HTML() 解析HTML文档
etree.tostring() 输出修正的文档
html.parse(文档,etree.HTMLParse())
data = html.xpath('规则') #推荐使用这个,chrome 开发者工具可以复制规则
(3) 主要使用结构位置
例
from lxml import etree
html = etree.parse('./test.html', etree.HTMLParser())
result = html.xpath('//li[@class="item-0"]')
print(result)
小例:
import requests
from lxml imoport etree
res = requests.get(url)
html = etree.HTML(res.text)
id = html.xpath('div[1]/a[2]/h2/text()')
项目实战:https://mp.csdn.net/postedit/83478140
详细知识请前往:https://cuiqingcai.com/5545.html
三、BeautifulSoup (from bs4 import BeautifulSoup)
BeautifulSoup (html,'lxml)
(1)Beautiful Soup支持的解析器
解析器 | 使用方法 | 优势 | 劣势 |
---|---|---|---|
Python标准库 |
| Python的内置标准库、执行速度适中、文档容错能力强 | Python 2.7.3及Python 3.2.2之前的版本文档容错能力差 |
lxml HTML解析器 |
| 速度快、文档容错能力强 | 需要安装C语言库 |
lxml XML解析器 |
| 速度快、唯一支持XML的解析器 | 需要安装C语言库 |
html5lib |
| 最好的容错性、以浏览器的方式解析文档、生成HTML5格式的文档 | 速度慢、不依赖外部扩展 |
(2)方法
find_all(name,strrs) 找出所有符合规则的
find(name,atrrs) 找出第一个符合规则的
CSS选择器select() 找出所有符合规则的 #推荐使用这个,因为chrome开发者工具能够复制规则
小例:
import requests
from bs4 import BeautifulSoup
res = requests.get(url)
soup = BeautifulSoup(res.text,'lxml')
id = soup.select('#page_list>u1>li')
项目实战:https://mp.csdn.net/postedit/83478140
具体知识请前往:https://cuiqingcai.com/5548.html
四、pyquery from pyquery import PyQuery
参考:https://cuiqingcai.com/5551.html
五、jsonpath (jsonpath.jsonpath()) 其实是xpath在json的使用
小例:
import json
json_string = '{"user_man":"xiangao"}'
json_data = json.loads(json_string)
print(json_data.get("user_man"))
或者print(json_data["user_man"])
实例:
import requests
import json
import jsonpath
import pygal
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)'
'AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.92 Safari/537.36'
}
url = 'http://pg.qq.com/zlkdatasys/data_zlk_zlzx.json'
respose = requests.get(url,headers = headers)
respose.encoding = 'utf-8'
html = respose.text #网页源代码文本格式
#print(html)
unicodest = json.loads(html)
two = jsonpath.jsonpath(unicodest,'$..yd_c6')#枪的特点
print(two)
three = jsonpath.jsonpath(unicodest,'$..ldtw_f2')#枪的性能
print(three)
four = jsonpath.jsonpath(unicodest,'$..mc_94') #枪的名字
print(four)
print(four[1:8])
data = []
num = 0
for a in three:
if num<7:
num+=1
data.append([int(a[0]['wl_45']),int(a[0]['sc_54']),int(a[0]['ss_d0']),int(a[0]['wdx_a7']),int(a[0]['zds_62'])])
print(data)
radar_chart = pygal.Radar()
radar_chart.title = '步枪的性能'
radar_chart.x_labels = ['威力','射程','射速','稳定性','子弹数']
for name,property in zip(four[1:8],data):
radar_chart.add(name,property)
radar_chart.render_to_file('枪支.svg')
此例子为用python实现吃鸡的梦想,具体请参考:https://blog.csdn.net/huang1600301017/article/details/83449330
jsonpath具体知识请前往:https://blog.csdn.net/huang1600301017/article/details/83450479
以上就是爬虫五大匹配库或解析库,从零开始学Python网络爬虫一书,把前三大库讲的非常详细哦
看到这里,是不是想要实战一下,项目实战:https://mp.csdn.net/postedit/83478140