浅学数据解析

文章介绍了Python中两种常用的数据解析方法:正则表达式(re模块)和BeautifulSoup库。正则表达式用于精确匹配和查找文本,例如通过边界匹配单词Hi。BeautifulSoup则用于解析HTML文档,提供了方便的接口来遍历和操作DOM树。文章强调了两者在处理文本和网页数据时的重要作用。
摘要由CSDN通过智能技术生成

最近学习的部分知识

数据解析

在最近学习中我们学习了两种解析方法,分别是正则表达式的re解析与BeautifulSoup解析器的使用

一、正则表达式

正则表达式是用来避免重复工作,处理有规律信息的一个有力工具

 

import re text = "Hi, I am Shirley Hilton. I am his wife." m = re.findall(r"hi", text) if m: print (m) else: print ('not match')

这是一个小实验,通过它来看,我们不难看出这是在通过某种方法寻找"Hi, I am Shirley Hilton. I am his wife."这段话中的"hi"通过这个我们发现会有两个结果,都是hi,分别来自于Shirly与his俩单词,由此我们看出,正则表达式是严格的,区分大小写的,Hi并不满足要求。
当然,不仅仅有这样的查找,也可以仅仅找部分的,比如只匹配“Hi”,在这段话中只想要计数一次,那么我们可以采用"\bHi\b"的查找对象,这样就能仅仅匹配单独的Hi啦。
“\b”在正则表达式中表示单词的开头或结尾,空格、标点、换行都算是单词的分割。而“\b”自身又不会匹配任何字符,它代表的只是一个位置。所以单词前后的空格标点之类不会出现在结果里。
然后[]符号的作用也很大,它的作用是表示满足括号中任一字符,例如我们想要Hi也想要hi,就可以[Hh]i

r

接下来继续解释这个小试验中的内容,在语句传参时的r的含义,为什么要加r?
r,是raw的意思,它表示对字符串不进行转义。例如:
 

>>> print ("\bhi") hi >>> print (r"\bhi") \bhi

re

re是python里的正则表达式模块。findall是其中一个方法,用来按照提供的正则表达式,去匹配文本中的所有符合条件的字符串。返回结果是一个包含所有匹配的list。
特殊字符
这里介绍
.除换行符以外的任意字符
\S不是空白符的任意字符
*****表示前面的字符可以重复任意多次(包括0次)
+表示前面的字符可以重复任意多次(不包括0次)
{}表示指定长度
[][]内任意字符
\w**匹配字母或数字或下划线或汉字 **
\d匹配数字
\s匹配空白符
**^ **匹配字符串的开始
$匹配字符串的结束
?重复零次或一次(懒惰匹配)
{n,}重复n次或更多次
{n,m}重复n到m次
很容易猜想到,如\s\S这样大小写的区分就是正反的区别,由此推出各个对应的相反,此外,[]内通过加就代表除此符号外任意字符
.*贪婪匹配
/*?懒惰匹配

二、BeautifulSoup解析器

[1]简介

Beautiful Soup是Python的一个库,能够从网页抓取数据提供了一些函数用来处理数据,用很少的代码就能够写出来一个完整的程序。

[2]特点

Beautiful Soup能够自动的将文档转换为utf-8编码格式,能够更为方便的进行使用

使用

[1]创建对象

要想创建一个Beautiful Soup对象,首先要导入库bs4,lxml,requests。

这里使用一个实例

 

html = """ <html><head><title>The Dormouse's story</title></head> <body> <p class="title" name="dromouse"><b>The Dormouse's story</b></p> <p class="story">Once upon a time there were three little sisters; and their names were <a href="http://example.com/elsie" class="sister" id="link1"><!-- Elsie --></a>, <a href="http://example.com/lacie" class="sister" id="link2">Lacie</a> and <a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>; and they lived at the bottom of a well.</p> <p class="story">...</p> """ soup = BeautifulSoup(html,'lxml') #创建 beautifulsoup 对象

同时也可以使用HTML文件直接创建对象

 

soup1 = BeautifulSoup(open('index.html'))

Beautiful Soup将复杂HTML文档转换成一个复杂的树形结构,每个节点都是Python对象,所有对象可以归纳为4种:
  • Tag
  • NavigableString
  • BeautifulSoup
  • Comment
1>Tag

Tag就是 HTML 中的一个个标签

通过这种方法就可以直接访问标签

 

print (soup.title) print (soup.head) print (soup.a) print (soup.p) print (type(soup.a))

Tag有两个重要的属性,name与attrs

并且可以对这些属性和内容进行修改

2>NavigableString

得到了标签的内容用 .string 即可获取标签内部的文字

例如

 

print(soup.a.string)

3>BeautifulSoup

BeautifulSoup 对象表示的是一个文档的全部内容.大部分时候,可以把它当作 Tag 对象,是一个特殊的 Tag,我们可以分别获取它的类型,名称:

4>Comment

[2]遍历文档树

tag 的 .contents 属性可以将tag的子节点以列表的方式输出
.children属性生成的是一个列表生成器对象,可以通过遍历获得其中的内容
.descendants 属性可以对所有tag的子孙节点进行递归循环,和 children类似,要获取其中的内容,我们需要对其进行遍历

还有许多关联选择方法

[3]CSS选择器

CSS的使用只需要调用select方法结合CSS选择器语法就可以实现元素定位

格式:soup.select()

1>id选择器

每段节点都有专属的id,通过id就可以匹配相应的节点,使用#加id就可以实现定位

2>类选择器

类选择器用.来定位元素

例如

The Dormouse’s story

中的title就是类名

3>标签选择器

直接使用标签来定位即可例如p

在定位时可以多种定位方法混合使用,达到更为理想的效果。

[4]CSS高级用法

1>嵌套选择

因为其仍旧是一个tag对象,所以可以使用嵌套选择

2>属性获取

使用attrs属性

3>文本获取

使用string与strings获取文本信息

[5]方法选择器

1>find_all()方法

soup传入整个HTML文档然后进行全文搜索

find_all(name,attrs,recursive,text,**kwargs)

name参数就是查找名字为name的节点,返回tag对象,这个传入的参数可以是字符串,可以是列表,正则,还可以是True(以此为参数可以获取所有的标签)

attrs参数是查询含有接受的属性值的标签,参数形式为字典类型例如{id:‘link1’}

kwargs参数是接收常用的属性参数的,如id和class,参数形式是变量赋值的形式,例如(id=‘link1’)
class 是关键字,使用时应该加下划线即class_=……

text参数是通过查询含有接受的文本的标签来查找的,参数形式是字符串

limit参数是用于限制返回结果的数量的参数,参数形式是整数,顾名思义

recursive参数是决定是否获取子孙节点的参数,参数形式是布尔值,默认是True

2>find方法

返回值是第一个符合条件的元素,除limit参数不存在外,其余参数都与find_all方法一致

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值