python爬虫---爬虫的数据解析的流程和解析数据的几种方式

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表达式?
    属性定位
    索引定位
    取文本
    取属性
posted @ 2019-10-10 22:31  染指未来  阅读(594)  评论(0编辑  收藏  举报