【python】几种常见的数据解析方式,你习惯用哪种呢?

一、正则表达式

1.介绍        

        正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个 “规则字符串”,这个 “规则字符串” 用来表达对字符串的一种过滤逻辑。

2.环境安装

pip install re

3.通配符(分别按使用分类)

(1)数量

1)匹配0个或1个字符(?)

表示前面一个字符可有可无

例:abc?(c可有可无,可匹配ab,abc等);

2)匹配0个或多个字符(*)

表示前面一个字符可以出现任意次数

例:ab*c(可以匹配ac,abc,abbc等);

3)匹配1个或多个字符(+)

表示前面一个字符可以出现任意次数

例:ab+c(可以匹配abc,abbc等);

4)(字符){N}'表示字符重复N次

(字符){N,M}'表示随便重复N到M次

(2)单字符

      1)'[A-Z]'表示A-Z任意一个

          '[a-z]'表示a-z任意一个

          '[0-9]'表示0-9任意一个

      2) 除外符(^)

匹配不是后面的字符

例:^[a-c](匹配不是字母a-c的字符)

      3) 任意字符(.)

表示匹配任意字符(匹配真正的点时前面加反斜杠(\))

例:.*(表示匹配任意一个字符出现任意次)

      4)元字符(系统自带)

大多以“\”开头

'\w'表示任意一个字母或数字及下划线(同[0-9A-Za-z])

‘\W’表示代表一个非字母字符

'\d'表示任意一个数字(同[0-9])

‘\D’表示代表一个非数字字符

‘\s’表示空白字符(空格,tab,换行符等)

‘\S’表示代表一个非空白字符

      5) 匹配“或”运算(|)

匹配两者中之一即可

例:cat|dog(匹配cat或者dog)

(3)匹配行首行尾(^、$)

^a匹配行首的a,$a匹配行尾的a

(4)分组(用括号括起来)

例如:ab(.*?)cd匹配以ab开头以cd结束的任意字符串

(5)匹配模式

            贪婪匹配(.*):趋向于最大长度匹配,匹配所有字符

            懒惰匹配(.*?):只匹配符合条件的串

注:

re.I表示不区分大小写

re.M表示多行匹配

re.S表示单行匹配(在数据解析中常用)

import re#导入re模块
#以下是re模块常用方法
m=re.match(s,'igrout') #match方法匹配是否完全相等(第一参数为文本匹配模式,第二参数为字符串)
print(m,m.group())
#group方法返回匹配成功的字符串
n=re.search(s,'imap') #search方法匹配是否搜索到字符串
c=re.findall('bike','bike,bike',re.I)
#findall函数返回一个所有匹配成功项目的列表
result=re.sub('bill','mike','bill is my son')
#第一个参数是要替换的串,第二个参数是要替换成的串
s=re.split(';','bill;mike',maxsplit=1)
#第一个参数是分隔符,第二个参数是要分割的串,第三个参数指定最大分割次数(maxsplit=\d)
#split()方法返回一个包含分割后元素的列表

二、bs4

1。原理:

(1)实例化一个BeautifulSoup对象,并且将页面源码数据加载到该对象中

(2)通过调用BeautifulSoup对象中相关的属性或者方法进行标签定位和数据提取

2.环境安装:

pip install bs4

pip install lxml

3.对象的实例化:

(1)将本地的html文档中的数据加载到该对象中:

fp=open(‘./文件名.html’,‘r’)

Soup=BeautifulSoup(fp, ‘lxml’)

(2)将互联网上获取的页面源码加载到该对象中:(更方便)

Page_text=response.text

Soup=BeautifulSoup(page_text, ‘lxml’)

4.数据解析的方法和属性:

——soup.标签名:返回的是文档中第一次出现的该标签名称的内容

——soup.find():

   ——find(‘标签名’):等同于soup.标签名

   ——属性定位:

      Soup.find(‘标签名’,class_/id/attr=‘标签标识’)

   ——soup.findAll(‘标签名称’):返回所有标签内容(列表)

——soup.select():

   ——soup.select(‘选择器’(id,class,标签等))(列表)

   ——层级选择器:

      ——soup.select(‘.父标签>子标签>子子标签’):

         “>”表示的是一个层级(加点是为了表示这是根节点

      ——soup.select(‘.父标签 子子标签’):

         “空格”表示的是多个层级

获取标签之间的文本数据(属性/方法):

——soup.标签名.text/string/get_text()

   ——text/get_text():可以获取某一个标签中的所有内容

   ——string:只可以获取该标签直系的文本内容

获取标签中属性值:

——soup.标签名[属性名]

from bs4 import BeautifulSoup  #导入BeautifulSoup模块
#1.把页面源代码交给BeautifulSoup进行处理,生产bs对象
html=BeautifulSoup(resp.text,"html.parser") #指定用html解析码
#2.从bs对象中查找数据
data1=html.find_all("table",class_="f_s_14")#返回数据是列表

三、Xpath解析

Xpath解析:最常用且最便捷高效的一种解析方式,具有通用性。

注:Xpath解析返回值是列表

——xpath解析原理:

   ——1.实例化一个etree对象,且需要将被解析的页面源码数据加载到该对象中。

   ——2.调用etree对象中的xpath方法结合着xpath表达式实现标签的定位和内容的捕获。

——环境的安装:

   ——pip install lxml

——如何实例化一个etree对象:from lxml import etree

   ——1.将本地的html文档中的源码数据加载到etree对象中:

      etree.parse(html文件名)

   ——2.可以将从互联网上获取的源码数据加载到该对象中

      etree.HTML(源码数据)

——xpath表达式【xpath(xpath表达式)】:

   ——/:表示的是一个层级(放在所有标签开头表示根标签)。

   ——//:表示的是多个层级(即可以从任意层级定位)。

   ——属性定位://标签名[@属性名=属性值]

   ——索引定位://标签名[@属性名=属性值]/子标签名[索引]

      注:索引从1开始

   ——取文本:

      ——标签名/text()获取的是标签中直系的文本内容

   ——标签名//text()获取的是标签中非直系的文本内容(所有内容)

   ——取属性:

      标签名/@属性名

   注意:xpath表达式可以用逻辑运算符连接(或|、和&等),当要批量获取的数据不在同一个标签位置时可以使用这个。

例如:tree.xpath(“//div/ul | //div/li”)表示既可以解析div标签下ul标签的内容也可解析div下li标签的内容

   注:服务器返回的html源码不一定包含有tbody标签,所以在使用xpath表达式时如果包含有tbody这一级标签,尽量将其去掉。

from lxml import etree#导入包
tree1=etree.parse(filepath)#filepath是html文档的路径
tree2=etree.HTML('page_text')#page_text是获取的响应数据
tree1.xpath('//div[@class="属性名称"]')
tree2.xpath('//div[@class="属性名称"]')

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值