最近学习的部分知识
数据解析
在最近学习中我们学习了两种解析方法,分别是正则表达式的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方法一致