您的位置:首页 > 编程语言 > Python开发

python爬虫学习笔记(二)——解析内容

2020-06-03 06:21 411 查看


- 获取到网页数据后,我们发现我们想要的信息隐藏在一堆无用信息之中,此时便需要解析网页数据的内容


补充:在一些其他的教程中,发现也可以用urllib模块获取数据,urllib模块是python内置的一个http请求库,不需要额外的安装。只需要关注请求的链接,参数,提供了强大的解析。requests库则需格外安装,但是个人感觉requests使用更简洁方便

标签解析

Beautiful Soup库的安装(Beautiful Soup库是解析、遍历、维护“标签树”的功能库)

按WIN键+R键打开运行,输入cmd后回车进入命令提示符

pip install beautifulsoup4


然而,有的时候获得网页HTML内容是这样的:


此时,我们可以利用 bs4库的prettify()方法 让HTML的内容更有条理且清晰便于解析

  • 对于HTML文件,由大量这种形式的基本元素的组成:



基本元素说明

基本元素 说明
Tag: 标签 最基本的信息组织单元,分别用<>和</>标明开头和结尾
Name: 标签的名字 <p…> </ p> 的名字是’p’ ,格式:< tag >.name
Attributes:标签的属性 字典形式组织,格式:< tag >.attrs
NavigableString:标签内非属性字符串 <>…</>中字符串,格式:< tag >.string
Comment:标签内字符串的注释部分 一种特殊的Comment类型,其输出的内容不包括注释符号



- HTML基本格式:




遍历标签树


1.标签树的下行遍历:

属性 说明
.contents 子节点的列表,将所有儿子节点存入列表
.children 子节点的迭代类型,与.contents类似,用于循环遍历儿子节点
.descendants 子孙节点的迭代类型,包含所有子孙节点,用于循环遍历
for child in soup.body.children:
print(child):      #遍历儿子节点
for child in soup.body.descendants:
print(child):      #遍历子孙节点


2.标签树的上行遍历:

属性 说明
.parent 节点的父亲标签
.parents 节点先辈标签的迭代类型,用于循环遍历先辈节点


3.标签树的平行遍历:

属性 说明
.next_sibling 返回按照HTML文本顺序的下一个平行节点标签
.previous_sibling 返回按照HTML文本顺序的上一个平行节点标签
.next_siblings 迭代类型,返回按照HTML文本顺序的后续所有平行节点标签
.previous_siblings 迭代类型,返回按照HTML文本顺序的前续所有平行节点标签
for sibling in soup.a.next_sibling:
print(sibling)          #遍历后续节点
for sibling in soup.a.previous_sibling:
print(sibling)          #遍历前续节点



搜索标签树


1.find_all方法:

<>.find_all(name, attrs, recursive, string,text,limit,**kwargs)

∙ name参数           # 对标签名称的检索字符串,又称字符串过滤:会查找与字符串完全匹配的内容

∙ attrs参数:         # 对标签属性值的检索字符串,可标注属性检索

∙ recursive参数:     # 是否对子孙全部检索,默认True

∙ string参数:        # <>…</>中字符串区域的检索字符串

∙ text参数:          # 通过text参数可以搜索文档中的字符串内容,与  name参数的可选值一样,text参数接受 字符串,正则表达式,列表

∙ **kwargs参数:      # 可变参数,有时候我们不知道要往函数中传入多少个关键词参数,或者想传入字典的值作为关键词参数时,则可以使用**kwargs。

∙ limit参数:         # 可以传入一个limit参数来限制返回的数量,当搜索出的数据量为5,而设置了limit=2时,此时只会返回前2个数据


2.find()方法:

<>.find()                    # 搜索且只返回一个结果,同.find_all()参数
<>.find_parents()            # 在先辈节点中搜索,返回列表类型,同.find_all()参数
<>.find_parent()             # 在先辈节点中返回一个结果,同.find()参数
<>.find_next_siblings()      # 在后续平行节点中搜索,返回列表类型,同.find_all()参数
<>.find_next_sibling()       # 在后续平行节点中返回一个结果,同.find()参数
<>.find_previous_siblings()  # 在前序平行节点中搜索,返回列表类型,同.find_all()参数
<>.find_previous_sibling()   # 在前序平行节点中返回一个结果,同.find()参数



正则提取

  • 正则表达式:通常用来检索、替换那些符合某个模式(规则)的文本。正则表达式是对字符串的一种逻辑公式,就是事先定义好的一些特定字符及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑,python中引用re模块(python内置模块,无需安装)操作正则表达式





Re库的主要功能函数:

re.search()      # 在一个字符串中搜索匹配正则表达式的第一个位置,返回match对象
re.search(pattern, string, flags=0)
∙ pattern :      # 正则表达式的字符串或原生字符串表示
∙ string :       # 待匹配字符串
∙ flags :        # 正则表达式使用时的控制标记
re.I / re.IGNORECASE   # 忽略正则表达式的大小写,[A‐Z]能够匹配小写字符
re.M / re.MULTILINE    # 正则表达式中的^操作符能够将给定字符串的每行当作匹配开始
re.S / re.DOTALL       # 正则表达式中的.操作符能够匹配所有字符,默认匹配除换行外的所有字符
re.L                   # 做本地化识别(locale-aware)匹配
re.U                   # 根据Unicode字符集解析字符。这个标志影响 \w, \W, \b, \B.
re.X                   # 该标志通过给予你更灵活的格式以便你将正则表达式写得更易于理解

re.match()       # 从一个字符串的开始位置起匹配正则表达式,返回match对象
re.match(pattern, string, flags=0)
∙ pattern :                # 正则表达式的字符串或原生字符串表示
∙ string :                 # 待匹配字符串
∙ flags :                  # 正则表达式使用时的控制标记

re.findall()     # 搜索字符串,以列表类型返回全部能匹配的子串
re.findall(pattern, string, flags=0)
∙ pattern :                # 正则表达式的字符串或原生字符串表示
∙ string :                 # 待匹配字符串
∙ flags :                  # 正则表达式使用时的控制标记

re.split()       # 将一个字符串按照正则表达式匹配结果进行分割,返回列表类型
re.split(pattern, string, maxsplit=0, flags=0)
∙ pattern :                # 正则表达式的字符串或原生字符串表示
∙ string : 				   # 待匹配字符串
∙ maxsplit: 			   # 最大分割数,剩余部分作为最后一个元素输出
∙ flags : 			       # 正则表达式使用时的控制标记

re.finditer()    # 搜索字符串,返回一个匹配结果的迭代类型,每个迭代元素是match对象
∙ pattern :                # 正则表达式的字符串或原生字符串表示
∙ string :                 # 待匹配字符串
∙ flags :                  # 正则表达式使用时的控制标记

re.sub()         # 在一个字符串中替换所有匹配正则表达式的子串,返回替换后的字符串
re.sub(pattern, repl, string, count=0, flags=0)
∙ pattern :                # 正则表达式的字符串或原生字符串表示
∙ repl : 				   # 替换匹配字符串的字符串
∙ string :				   # 待匹配字符串
∙ count : 				   # 匹配的最大替换次数
∙ flags : 				   # 正则表达式使用时的控制标记

re.compile       # 将正则表达式的字符串形式编译成正则表达式对象
re.compile(pattern, flags=0)
∙ pattern :                # 正则表达式的字符串或原生字符串表示
∙ flags :                  # 正则表达式使用时的控制标记

Match对象的属性:

属性 说明
.string 待匹配的文本
.re 匹配时使用的patter对象(正则表达式)
.pos 正则表达式搜索文本的开始位置
.endpos 正则表达式搜索文本的结束位置


Match对象的方法:

方法 说明
.group(0) 获得匹配后的字符串
.start() 匹配字符串在原始字符串的开始位置
.end() 匹配字符串在原始字符串的结束位置
.span() 返回(.start(), .end())


贪婪匹配(Re库默认采用贪婪匹配,即输出匹配最长的子串)

>>> match = re.search(r'PY.*N', 'PYANBNCNDN')
>>> match.group(0)
'PYANBNCNDN'


最小匹配

>>> match = re.search(r'PY.*?N', 'PYANBNCNDN')
>>> match.group(0)
'PYAN'


最小匹配操作符

操作符 说明
*? 前一个字符0次或无限次扩展,最小匹配
+? 前一个字符1次或无限次扩展,最小匹配
?? 前一个字符0次或1次扩展,最小匹配
{m,n}? 扩展前一个字符m至n次(含n),最小匹配



以上便是个人学习爬虫时整理的一些资料笔记,望大家请多多指教

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: