数据解析,就是对网页源码数据的解析和清洗,获取自己想要的数据信息。
常用的数据解析有下面四种:
1.正则
2.bs4
3.xpath
4.pyquery
一:
正则:熟练使用正则表达式,对数据进行提取即可
二:BS4
解析原理:
1.实例化一个BeautifulSoup的一个对象,并且将即将被解析的页面源码加载到该对象中
2.调用bs对象中相关属性和方法进行标签定位和数据的提取
环境安装:
pip install lxml
pip install bs4
使用;
from bs4 import BeautifulSoup
1.实例化一个BeautifulSoup
BeautifulSoup (fp,'lxml') # 使用本地存储的一张html文件
BeautifulSoup (response,'lxml') #将互联网请求的页面源码数据加载到bs对象中
2.bs相关属性和方法
BeautifulSoup对象.标签名 #可以定位到第一次出现的tagName标签,返回值是一个单数
事例:soup.div
BeautifulSoup对象.find('标签名',属性名='属性值') #可以定位到属性,返回定位到的第一个标签 是单数
事例:soup.find('div',id='test') #class是关键字,使用class_
BeautifulSoup对象.find_all('标签名',属性名='属性值') #定位到符合要求的所有标签,是列表
事例:soup.find_all('div',class_='test')
BeautifulSoup对象.select('选择器')
事例:soup.select('#test > .test div > li ') # 该事例是,查找id为test的标签下第一层class属性为test,下面的多层div标签下面的li标签
> 表示层级关系为一层,‘ ’空格表示多层层级关系
3.取值
获取标签文本内容:soup对象.string #获取标签的直系文本内容
soup对象.text soup对象.get_text() #获取标签下的所有文本内容,包含子标签文本
获取标签属性值:
soup对象['src'], ['href'] 等等 #即可获取标签属性的值
三:xpath
优点:xpath可以在不同语言中都可使用,具有较强的通用性
解析原理:
1.实例化一个etree的对象,将即将被计息的页面源码加载到该对象中
2.调用etree对象中的xpath方法,结合着不同的xpath表达式实现标签定位和数据提取
环境安装:
pip install lxml
使用:
from lxml import etree
实例化etree对象:
etree.parse('本地文件路径')
etree.HTML('通过互联网获取的页码源码 ')
xpath表达式:
etree对象.xpath(表达式) #返回值都是一个列表
标签定位:
/表示一个层级 #最左侧为一个斜杠,表示必须从根节点开始进行标签定位(相当于绝对路径)
//表示多个层级 #最左侧为两个斜杠,表示可以从任意位置进行标签定位()
属性定位:
//标签名[@属性名=属性值]
tree.xpath(' //div[@id="test"] ') #定位获取属性id为test的标签
索引定位:
//标签名[index] # 表达式中的索引是从1开始
tree.xpath(' //div[@id="test"]/li[2] ') # 定位id为test的标签下面的第二个li标签
取值:
取文本:/text() 和 //text()
tree.xpath(' //div[@id="test"]/li[2]/text() ') #获取第二个li标签下的文本值
tree.xpath(' //div[@id="test"]/li[2]//text() ') # 获取第二个li标签下的所有文本值(包含他的子标签文本)
取属性:/@属性名
tree.xpath(' //div[@id="test"]/a[2]/@href ') #获取第二个a标签下的href属性的值
四:pyquery
解析原理:
1.实例化一个PyQuery的对象,将即将被计息的页面源码加载到该对象中
2.调用PyQuery对象中的方法,实现标签定位和数据提取
环境安装:
pip install pyquery
使用:
from pyquery import PyQuery
实例化PyQuery 对象:
pq = PyQuery(filename='index.html') #使用本地html文件
pq = PyQuery(response) #使用网页源码文本数据
pq = PyQuery(url='https://www.baidu.com') #使用网址
标签定位:
pq(' li ')
pq(' div ')
属性定位:
PyQuery对象('选择器')
pq('#test .item-0 a span') # id为test下面的,class为.item-0,下面的a标签,下面的span标签
取值:
取文本:PyQuery标签对象.text()
pq(' a ').text() #获取a标签下的文本值
取属性:
PyQuery标签对象.attr.属性名
PyQuery标签对象.attr['属性名']
pq(' a ').attr.href #定位获取a标签的href值
属性的添加和删除:
div = pq('.test.active') #创建li对象
div.remove_class('active')
div.add_class('active)
属性,样式设置: # 有该属性样式就修改,没有就添加
div.attr('id','test')
div.css('display','block')
查找删除标签:
div.find('a').remove() #查找div对象下的所有a标签,并删除