1. 正则表达式
表达式 | 说明 |
---|---|
. | 除了 \n 和 \r 的所有字符 |
\d | 数字 |
\D | 非数字 |
\w | 字母和下划线 |
\W | 非字母和下划线 |
\s | 空格(包括制表符、换页符等) |
[a-z] | 小写英文字母 |
[a-zA-Z0-9] | 大小写英文字母与数字 |
[123] | 数字123 |
[^123] | 不是数字123 |
* | 出现次数>=0 |
+ | 出现次数>=1 |
{n} | 出现次数=n |
{n,m} | m>=出现次数>=n |
^ | 以开头 |
$ | 以结尾 |
? | 关闭贪婪模式 |
() | 用于获取括号内匹配成功的字符串 |
案例
案例1:定义密码的正则表达式
规则:英文字母开头,可以包括数字、大小写英文字母、下划线,6-16位
password pattern=^[a-zA-Z]{1}[a-zA-Z0-9_]{5-15}$
password pattern ==^[a-zA-Z][a-zA-Z0-9_]{5-15}$
案例2:匹配div标签,class="class1"中的文本内容
(1)< div class="cass1">要匹配的内容</div>
div_pattern1 ='<div class="class1">(.*)</div>'
(2)<div>< div class="cass1">要匹配的内容</div></div>
div_pattern1 ='<div class="class1">(.*?)</div>'
2. re模块
提取
import re
ret=re. fingal(【正则表达式】,【被提取的字符串】)
注:返回的类型是列表
匹配
import re
ret= re match(【正则表达式】,【被匹配的字符串】)
注:
如果匹配成功,返回 <cass’ re Match> 对象
如果匹配不成功,返回 None
替换
import re
ret=re.sub(【正则表达式】,【【替换成的字符串】,【被匹配的字符串】)
代码解析
index.html文件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<footer>
<div>
<div class="email">
Email:kefu@163.com
</div>
<div class="tel">
手机号:400-600-0109
</div>
</div>
</footer>
</body>
</html>
re_test.py文件
import re
with open('index.html','r',encoding='utf-8') as f:
html=f.read()
html = re.sub('\n', '', html) # HTML文件中的回车替换为空格
print(html)
# 输出
'''
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>Title</title></head><body> <footer> <div> <div class="email"> Email:kefu@163.com </div> <div class="tel"> 手机号:400-600-0109 </div> </div> </footer></body></html>
'''
pattern_1='<div class="email">(.*?)</div>'
ret_1=re.findall(pattern_1,html)
print(ret_1[0].strip()) # ret_1[0].strip() 去掉开头结尾的空格符
# 输出 Email:kefu@163.com
password_pattern =r'^[a-zA-Z][a-zA-Z0-9_]{5,15}$'
pass1='1234567'
pass2='k123456'
pass3='k123'
print(re.match(password_pattern,pass1))
# 输出 None
print(re.match(password_pattern,pass2))
# 输出 <_sre.SRE_Match object; span=(0, 7), match='k123456'>
print(re.match(password_pattern,pass3))
# 输出 None
3. Xpath
XPath语法
表达式 | 描述 |
---|---|
/ | 根节点选取载下级 |
// | 任意节点,不考虑位置 |
. | 当前节点 |
… | 当前节点的父节点 |
@ | 选取属性 |
* | 匹配任何节点 |
【nodename】 | 根据节点筛选 |
contains(@属性,“包含的内容”) | 模糊查询 |
text() | 文本内容 |
注:XPath中的索引从1开始
案例:
一级分类: //h3[@class" classify_c_h3"]/a/text()
二级分类: //div[@class="classify_list"]/span/a/text()
//div[contains(@class,"classify list")]/span/a/text()
4. lxml模块
首先摘取一个页面的源码,存放到.html文件中,这里选择CSDN学院的首页,存储文件名为csdn.html
import lxml.etree as le
with open('csdn.html','r',encoding='utf-8') as f:
html = f.read()
#print(html)
html_x = le.HTML(html) # 转换为xpath
print(html_x) # 输出 <Element html at 0x38a3f80>
div_xs = html_x.xpath(' //div[@class="classify_cList"]')
print(div_xs)
# 输出 list
'''
[<Element div at 0xcab18c8>, <Element div at 0xcab18a0>, <Element div at 0xcab1878>, <Element div at 0xcab1850>, <Element div at 0xcab1828>, <Element div at 0xcab15a8>]
'''
data_s =[]
for div_x in div_xs:
category1 = div_x.xpath('./h3/a/text()')[0]
#print(category1)
category2_s = div_x.xpath('./div/span/a/text()')
#print(category2_s)
data_s.append(
dict(
category1 = category1,
category2_s = category2_s
)
)
#print(data_s)
for data in data_s:
print(data.get('category1'))
for category2 in category2_s:
print(' ',category2)
# 输出
'''
人工智能
机器学习
深度学习
计算机视觉
人工智能
C/C++
Java
Python
编程语言
C/C++
Java
Python
人工智能
华为认证
思科认证
软考
编程语言
华为认证
思科认证
软考
考试认证
华为认证
思科认证
软考
人工智能
iOS
微信开发
Swift
编程语言
iOS
微信开发
Swift
考试认证
iOS
微信开发
Swift
移动开发
iOS
微信开发
Swift
人工智能
Hadoop
Docker/K8S
Spark
编程语言
Hadoop
Docker/K8S
Spark
考试认证
Hadoop
Docker/K8S
Spark
移动开发
Hadoop
Docker/K8S
Spark
云计算/大数据
Hadoop
Docker/K8S
Spark
人工智能
系统/网络/运维
数据库
区块链
编程语言
系统/网络/运维
数据库
区块链
考试认证
系统/网络/运维
数据库
区块链
移动开发
系统/网络/运维
数据库
区块链
云计算/大数据
系统/网络/运维
数据库
区块链
其他课程
系统/网络/运维
数据库
区块链
'''