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表达式?
属性定位
索引定位
取文本
取属性

python爬虫---爬虫的数据解析的流程和解析数据的几种方式的更多相关文章

  1. Log4j源码解析--框架流程+核心解析

    OK,现在我们来研究Log4j的源码: 这篇博客有参照上善若水的博客,原文出处:http://www.blogjava.net/DLevin/archive/2012/06/28/381667.htm ...

  2. 在Python中反向遍历序列(列表、字符串、元组等)的五种方式

    1. reversed() a = [1, 2, 3, 4] for i in reversed(a): print(i) 2. range(len(a)-1, -1, -1) a = [1, 2, ...

  3. Repeater 控件 当数据源没有数据的时候显示 暂无数据 的两种方式

    第一种:现在前台给Repeater控件外面的div加一个runat=”server”  然后在cs后台判断数据源是否为空, 是的话就修改这个前台div的InnerText或者是InnerHtml 即可 ...

  4. 【TP3.2 + 其他任何PHP框架】编辑、删除、添加数据,返回原分页 (ajax+form两种方式提交均可以)

    1.目的1:在如下的一个页面中,p=2,比如我们删除数据id=13,通过ajax提交{id,p} 这2个参数,就可以了,页面返回json的url参数中原样带上p即可. 2.目的2: 步骤1:在如下页面 ...

  5. Python 35 线程(1)线程理论、开启线程的两种方式

    一:线程理论 1 什么是线程 进程其实一个资源单位,而进程内的线程才是cpu上的执行单位 线程其实指的就是代码的执行过程2 为何要用线程   线程vs进程     1. 同一进程下的多个线程共享该进程 ...

  6. 05.Python网络爬虫之三种数据解析方式

    引入 回顾requests实现数据爬取的流程 指定url 基于requests模块发起请求 获取响应对象中的数据 进行持久化存储 其实,在上述流程中还需要较为重要的一步,就是在持久化存储之前需要进行指 ...

  7. 05,Python网络爬虫之三种数据解析方式

    回顾requests实现数据爬取的流程 指定url 基于requests模块发起请求 获取响应对象中的数据 进行持久化存储 其实,在上述流程中还需要较为重要的一步,就是在持久化存储之前需要进行指定数据 ...

  8. 《Python网络爬虫之三种数据解析方式》

    引入 回顾requests实现数据爬取的流程 指定url 基于requests模块发起请求 获取响应对象中的数据 进行持久化存储 其实,在上述流程中还需要较为重要的一步,就是在持久化存储之前需要进行指 ...

  9. 05 Python网络爬虫的数据解析方式

    一.爬虫数据解析的流程 1.指定url 2.基于requests模块发起请求 3.获取响应中的数据 4.数据解析 5.进行持久化存储 二.解析方法 (1)正则解析 (2)bs4解析 (3)xpath解 ...

随机推荐

  1. CEF3相关知识汇总(不断更新)

    CEF全称是Chromium Embedded Framework,它是Chromium的Content API的封装库. CEF官网地址:https://bitbucket.org/chromium ...

  2. Java多线程编程核心技术-第3章-线程间通信-读书笔记

    第 3 章 线程间通信 线程是操作系统中独立的个体,但这些个体如果不经过特殊的处理就不能成为一个整体.线程间的通信就是成为整体的必用方案之一,可以说,使线程间进行通信后,系统之间的交互性会更强大,在大 ...

  3. jquery保存cookie,php读取cookie操作

    //保存时间 var Days = 30; var exp = new Date(); exp.setTime(exp.getTime() + Days*24*60*60*1000); //保存内容, ...

  4. hadoop KerberosUtil 做Kerberos认证

    网上找了一下,自己写了个KerberosUtil工具类,测试过可以用. 注意这个不是 org.apache.hadoop.security.authentication.util.KerberosUt ...

  5. 安装服务器pve虚拟系统(可以通过web管理物理机集群资源与虚拟机)

    做此系统前,可以先进入bios,设置一下ipmi的网络地址.可以远程管理服务器 输入服务器的ipmi里面配置的ip 默认账号与密码admin 点击launch 会自动下载认证文件 下载好java软件环 ...

  6. 请简要描述margin重复问题,及解决方式

    两个相邻的盒子垂直方向上的margin会发生重叠,取较大的那个值,而不是相加. 解决: 父级设置padding代替margin 父级设置overflow:hidden 当前元素设置透明的边框 使用绝对 ...

  7. Spring事务注解@Transactional失效的问题

    在项目中发现事务失效,使用@Transactional注解标注的Service业务层实现类方法全部不能回滚事务了,最终发现使用因为Spring与shiro进行整合之后导致的问题,将所有的Service ...

  8. PyTorch学习之六个学习率调整策略

    PyTorch学习率调整策略通过torch.optim.lr_scheduler接口实现.PyTorch提供的学习率调整策略分为三大类,分别是 有序调整:等间隔调整(Step),按需调整学习率(Mul ...

  9. Python【每日一问】18

    问: [基础题]:请解释新式类跟经典类,并说明它们的区别[提高题]:请解释Python垃圾回收机制 答: [基础题]:请解释新式类跟经典类,并说明它们的区别 1.新式类都是继承内置 object 对象 ...

  10. 蚂蚁花呗5面面试真题,你敢来挑战一下吗?(Java岗)

    蚂蚁花呗一面(一个小时): JDK 中有哪几个线程池?顺带把线程池讲了个遍 Java容器有哪些?哪些是同步容器,哪些是并发容器? ArrayList和LinkedList的插入和访问的时间复杂度? j ...