正则解析模块re
re模块使用流程
- 方法一
r_list=re.findall('正则表达式',html,re.S)
- 方法二
# 1、创建正则编译对象
pattern = re.compile('正则表达式',re.S) re.S 表示可以匹配换行
r_list = pattern.findall(html)
正则表达式元字符
元字符 | 含义 |
---|---|
. | 任意一个字符(不包括\n) |
\d | 一个数字 |
\s | 空白字符 |
\S | 非空白字符 |
[] | 包含[]内容 |
* | 出现0次或多次 |
+ | 出现1次或多次 |
匹配任意一个字符的正则表达式
import re
# 方法一
pattern = re.compile('.', re.S)
# 方法二
pattern = re.compile('[\s\S]')
贪婪匹配和非贪婪匹配
贪婪匹配
1、在整个表达式匹配成功的前提下,尽可能多的匹配 *
2、表示方式:.* .+ .?
非贪婪匹配
1、在整个表达式匹配成功的前提下,尽可能少的匹配 *
2、表示方式:.*? .+? .??
见示例代码:05_re_greed.py
import re
html = '''
<html>
<div><p>九霄龙吟惊天变</p></div>
<div><p>风云际会浅水游</p></div>
<html>
'''
# 贪婪匹配
pattern = re.compile('<div><p>.*</p></div>', re.S)
r_list = pattern.findall(html)
print(r_list)
# 非贪婪匹配
pattern = re.compile('<div><p>(.*?)</p></div>', re.S)
r_list = pattern.findall(html)
print(r_list)
正则表达式分组
作用
在完整的模式中定义子模式,将每个圆括号中子模式匹配出来的结果提取出来
示例
import re
s = 'A B C D'
p1 = re.compile('\w+\s+\w+')
print(p1.findall(s))
# ['A B','C D']
# 分析结果是什么???
p2 = re.compile('(\w+)\s+\w+')
print(p2.findall(s))
# ['A', 'C']
# 分析结果是什么???
p3 = re.compile('(\w+)\s+(\w+)') # 一旦正则里面有两个或两个以上的分组,就是列表套元组
print(p3.findall(s))
# ['A B','C D']
# [('A', 'B'),('C', 'D')]
# 分析结果是什么???
分组总结
1、在网页中,想要什么内容,就加()
2、先按整体正则匹配,然后再提取分组()中的内容
如果有2个及以上分组(),则结果中以元组形式显示 [(),(),()]
xpath解析
- 定义
XPath即为XML路径语言,它是一种用来确定XML文档中某部分位置的语言,同样适用于HTML文档的检索
- 示例HTML代码
<ul class="book_list">
<li>
<title class="book_001">Harry Potter</title>
<author>J K. Rowling</author>
<year>2005</year>
<price>69.99</price>
</li>
<li>
<title class="book_002">Spider</title>
<author>Forever</author>
<year>2019</year>
<price>49.99</price>
</li>
</ul>
- 匹配演示
1、查找所有的li节点
//li
2、查找li节点下的title子节点中,class属性值为'book_001'的节点
//li/title[@class="book_001"]
3、查找li节点下所有title节点的,class属性的值
//li//title/@class
# 只要涉及到条件,加 []
# 只要获取属性值,加 @
- 选取节点
1、// :从所有节点中查找(包括子节点和后代节点)
2、@ :获取属性值
# 使用场景1(属性值作为条件)
//div[@class="movie"]
# 使用场景2(直接获取属性值)
//div/a/@src
- 匹配多路径(或)
xpath表达式1 | xpath表达式2 | xpath表达式3 可以针对那些class不一样的进行查找
- 常用函数
1、contains() :匹配属性值中包含某些字符串节点
# 查找class属性值中包含"book_"的title节点
//title[contains(@class,"book_")]
//div[contains(@class,'article block untagged mb15')]
2、text() :获取节点的文本内容
# 查找所有书籍的名称
//ul[@class="book_list"]/li/title/text()
练习
1.获取猫眼电影中的电影信息的dd节点
//dl[@class='board-wrapper']/dd
2.获取电影名称的xpath
//dl[@class='board-wrapper']/dd//p/a
3.获取电影主演的xpath
//dl[@class='board-wrapper']/dd//p[@class='star']/text()
4.获取上映时间的xpath
//dl[@class='board-wrapper']/dd//p[@class='releasetime']/text()
lxml解析库
- 安装
sudo pip3 install lxml
- 使用流程
1、导模块
from lxml import etree
2、创建解析对象
parse_html = etree.HTML(html)
3、解析对象调用xpath
r_list = parse_html.xpath('xpath表达式') # 结果一定是列表
- 练习
from lxml import etree
html = '''<div class="wrapper">
<i class="iconfont icon-back" id="back"></i>
<a href="/" id="channel">新浪社会</a>
<ul id="nav">
<li><a href="http://domestic.firefox.sina.com/" title="国内">国内</a></li>
<li><a href="http://world.firefox.sina.com/" title="国际">国际</a></li>
<li><a href="http://mil.firefox.sina.com/" title="军事">军事</a></li>
<li><a href="http://photo.firefox.sina.com/" title="图片">图片</a></li>
<li><a href="http://society.firefox.sina.com/" title="社会">社会</a></li>
<li><a href="http://ent.firefox.sina.com/" title="娱乐">娱乐</a></li>
<li><a href="http://tech.firefox.sina.com/" title="科技">科技</a></li>
<li><a href="http://sports.firefox.sina.com/" title="体育">体育</a></li>
<li><a href="http://finance.firefox.sina.com/" title="财经">财经</a></li>
<li><a href="http://auto.firefox.sina.com/" title="汽车">汽车</a></li>
</ul>
<i class="iconfont icon-liebiao" id="menu"></i>
</div>'''
# 创建解析对象
parseHtml = etree.HTML(html)
# 调用xpath返回结束,text()为文本内容
# 提取所有的a的内容
rList = parseHtml.xpath('//a/text()')
#print(rList)
# 提取所有的href的属性值
r2 = parseHtml.xpath('//a/@href')
#print(r2)
# 提取所有href的值,不包括 /
r3 = parseHtml.xpath('//ul[@id="nav"]/li/a/@href')
#print(r3)
# 获取 图片、军事、...,不包括新浪社会
r4 = parseHtml.xpath('//ul[@id="nav"]/li/a/text()')
for r in r4:
print(r)