正则表达式
首先要导入re库
其中常用的函数:compile函数
格式为
re.complie(pattern[, flags])
pattern : 一个字符串形式的正则表达式
flags 可选,表示匹配模式,比如忽略大小写,多行模式等,具体参数为:
re.I 忽略大小写
re.L 表示特殊字符集 \w, \W, \b, \B, \s, \S 依赖于当前环境
re.M 多行模式
re.S 即为’ . ‘并且包括换行符在内的任意字符(’ . ‘不包括换行符)
re.U 表示特殊字符集 \w, \W, \b, \B, \d, \D, \s, \S 依赖于 Unicode 字符属性数据库
re.X 为了增加可读性,忽略空格和’ # '后面的注释

常用的.表示匹配任意字符,*?表示任意内容

re里match,search,findall的区别?
import re
a = ‘abc1d2ef3y’
b = ‘3721a3690’
resultA = re.match(’[0-9]’, a)
print(resultA)
#打印结果是None,就是没有匹配到,为什么没有匹配到呢,a中明明包含的有数字啊,因为match是从字符串的第一个字符开始匹配
#而a这第一个字符是a,是个字母,不是0到9的任意一个数值,所以没有匹配到,返回结果是None
resultB = re.match(’[0-9]’, b)
print(resultB)
#打印结果是<re.Match object; span=(0, 1), match=‘3’>,匹配结果是3,位置是从0开始到第1个分片截取的数值就是3。
‘’’
如何拿到match匹配到的结果?
‘’’
if resultB:
print(“正则表达是match匹配到的结果是:”, resultB.group())
##输出结果是3。 为什么要判断一下,因为如果match不到值,同时用group方法的话就会导致程序报错,所以要先判断下是否有值
resultC = re.search(’[0-9]’, a)
print(resultC)
##打印结果是<re.Match object; span=(3, 4), match=‘1’>,这个和用match有明显的区别,索引位置是3-4
#这是从第一个开始,没有规定说第一个必须是规则中写的0-9的任意数字,即全局匹配
resultD = re.findall(’[0-9]’, a)
print(resultD)
##打印结果是[‘1’, ‘2’, ‘3’],找所有能匹配到的东西,统统拿出来,结果是个列表

可以发现比较明显的区别是如果match和search都是遇到第一个即返回,match只匹配开头,search是发现符合的就返回,还是findall比较符合实际需求

Findall实战
import re
pattern = re.compile(’.?this_is_a_test.?>(.?).?data2:(.?)’,re.S)
html=’.hello,this_is_a_test,end>here is the data data2:this is data2’
items = re.findall(pattern, html)
print(items)
输出:
python3爬虫-正则表达式
通过(.
?)和前后文来构造想要数据正则表达式

爬虫实战

尝试爬取南京天气预报,通过百度搜索,得到中国天气网的南京气象url
http://www.weather.com.cn/weather/101190101.shtml
python3爬虫-正则表达式
在谷歌浏览器的network选项里可以查看到网页的元素
尝试使用requests建立一个简单的爬取
import requests
def get_one_page(url):
response = requests.get(url)
if response.status_code == 200:
return response.text
return None

def main():
url = ‘http://www.weather.com.cn/weather/101190101.shtml’
html = get_one_page(url)
print(html)
main()
发现爬取后又有乱码的情况存在,初步猜测是中文解码失败
python3爬虫-正则表达式
搜索后发现原因:《HTTP权威指南》里第16章国际化里提到,如果HTTP响应中Content-Type字段没有指定charset,则默认页面是’ISO-8859-1’编码。这处理英文页面当然没有问题,但是中文页面,就会有乱码了,将编码方式改为utf-8即可
在其中按下ctrl+f搜索今天,明天,查看对应标签
python3爬虫-正则表达式
再看下明天
python3爬虫-正则表达式
def get_data(text_str):
pattern = re.compile(’

.?(今天)

.?<p title=.?class=“wea”>(.?)

.?

.?(明天)

.?<p title=.?class=“wea”>(.*?)’, re.S)
items=re.findall(pattern,text_str)
print(items)
输出:
python3爬虫-正则表达式

相关文章:

  • 2021-10-01
  • 2021-04-23
  • 2021-07-08
  • 2021-09-23
  • 2021-10-23
  • 2021-09-19
  • 2021-12-17
  • 2022-12-23
猜你喜欢
  • 2021-06-27
  • 2021-04-05
  • 2021-08-11
  • 2022-12-23
  • 2022-12-23
  • 2021-12-22
相关资源
相似解决方案