python爬虫---爬虫的数据解析的流程和解析数据的几种方式
一丶爬虫数据解析
概念:将一整张页面中的局部数据进行提取/解析
作用:用来实现聚焦爬虫的吧
实现方式:
正则 (针对字符串)
bs4
xpath (最常用)
pyquery " https://www.jianshu.com/p/770c0cdef481" # 有待查询
数据解析的通用原理是什么?
标签的定位
数据的提取
页面中的相关的字符串的数据都存储在哪里呢?
标签中间
标签的属性中
基于聚焦爬虫的编码流程
1. 指定url
2. 发起请求
3. 获取响应数据
4. 数据解析
5. 持久化存储
正则解析
### 使用python中的re模块进行正则匹配,对找到的指定数据进行数据解析
# 例如:
# text获取页面内容.
page_text = requests.get(url,headers=headers).text
# 解析数据:img标签的src的属性值
ex = '<div class="text">.*?<img src="(.*?)" referrerPolicy.*?</div>'
# ex 是正则表达式,page_text是获取的页面,flags=re.S表示不换行(一行查找,正则表达式会将这个字符串作为一个整体,在整体中进行匹配)
img_src_list = re.findall(ex,page_text,re.S)
BS4解析
# 概述BS4的用法
# 环境的安装:
pip install bs4
pip install lxml
# bs4的解析原理:
实例化一个BeautifulSoup的一个对象,把即将被解析的页面源码数据加载到该对象中
需要调用BeautifulSoup对象中的相关的方法和属性进行标签定位和数据的提取
# BeautifulSoup的实例化
BeautifulSoup(fp,'lxml'):将本地存储的html文档中的页面源码数据加载到该对象中
BeautifulSoup(page_text,'lxml'):将从互联网中请求道的页面源码数据加载到改对象中
# 标签的定位
标签定位:soup.tagName:只可以定位到第一个tagName标签
属性定位:soup.find('tagName',attrName='value'),只可以定位到符合要求的第一个标签
# findAll:返回值是一个列表。可以定位到符合要求的所有标签
选择器定位:soup.select('选择器')
# 选择器:id,class,tag,层级选择器(大于号表示一个层级,空格表示多个层级)
# 取文本
text:将标签中所有的文本取出
string:将标签中直系的文本取出
# 取属性
tag['attrName']
XPATH解析
# 概述
# 环境的安装
pip install lxml
# 解析原理
实例化一个etree的对象,且把即将被解析的页面源码数据加载到该对象中
调用etree对象中的xpath方法结合这不同形式的xpath表达式进行标签定位和数据提取
# etree对象的实例化
etree.parse('fileName')
etree.HTML(page_text)
# 标签定位
最左侧的/:一定要从根标签开始进行标签定位
非最左侧的/:表示一个层级
最左侧的//:可以从任意位置进行指定标签的定位
非最左侧的//:表示多个层级
属性定位://tagName[@attrName="value"]
索引定位://tagName[@attrName="value"]/li[2],索引是从1开始
逻辑运算:
找到href属性值为空且class属性值为du的a标签
//a[@href="" and @class="du"]
模糊匹配:
//div[contains(@class, "ng")]
//div[starts-with(@class, "ta")]
# 取文本
/text():直系的文本内容
//text():所有的文本内容
# 取属性
/@attrName
其他问题
# 乱码问题
# 1. 先编码成 iso-8895-1 在解码
img_name = img_name.encode('iso-8859-1').decode('gbk')
# .bs4实现的数据解析中常用的方法和属性有哪些?各自的作用是什么?
soup.tagName
find/findAll()
select()
text/string
tag['attrName]
# .写出常用的xpath表达式?
属性定位
索引定位
取文本
取属性