什么是微网站系统,如何搭建网站,山东建设厅执业资格注册中心网站,网站建设公司财务预算正则表达式
常用的匹配模式
\d # 匹配任意一个数字
\D # 匹配任意一个非数字
\w # 匹配任意一个单词字符#xff08;数字、字母、下划线#xff09;
\W # 匹配任意一个非单词字符
. # 匹配任意一个字符#xff08;除了换行符#xff09;
[a-z] # 匹配任意一个小写字母
[…正则表达式
常用的匹配模式
\d # 匹配任意一个数字
\D # 匹配任意一个非数字
\w # 匹配任意一个单词字符数字、字母、下划线
\W # 匹配任意一个非单词字符
. # 匹配任意一个字符除了换行符
[a-z] # 匹配任意一个小写字母
[\u4e00-\u9fa5] # 匹配任意一个汉字
^ # 匹配字符串的开始
$ # 匹配字符串的结束
? # 匹配0次或1次# 匹配1次或多次
* # 匹配任意次
{n} # 匹配n次
{n,} # 至少匹配n次
{n, m} # 至少匹配n次 最多匹配m次
a|b # 匹配a或者b# 匹配括号内的表达式正则表达式的基础演示
# 1.匹配符合指定个数的字符串
# 导入正则表达式的库
import re
tel 123456
tel1 1234567
result re.match(^\d{6}$,tel)
result1 re.match(\d{6}$,tel1)
result3 re.match(\d{6}, tel)
print(result) # 返回结果re.Match object; span(0, 6), match123456
print(result1) # 返回结果None
print(result3) # 返回结果re.Match object; span(0, 6), match123456# 1.匹配汉字
name 啦啦1啦
name2 2哈哈哈
# match是从开头开始搜索开头有汉字就有没汉字就没有
result re.match([\u4e00-\u9fa5]{2,4}, name)
result1 re.match([\u4e00-\u9fa5]{2,4}, name2) # 从开头开始搜索
# search是全局搜索
result2 re.search([\u4e00-\u9fa5]{2,4}, name2)
result3 re.search([\u4e00-\u9fa5]{2,4}, name)
print(result)
print(result1)
print(result2)
print(result3)
# 返回的结果依次是
# re.Match object; span(0, 2), match啦啦
# None
# re.Match object; span(1, 4), match哈哈哈
# re.Match object; span(0, 2), match啦啦# 3. search 只匹配一次findall 对整个字符串进行检索
keys good good study 2012 , day day up 2022
result re.search(good, keys)
print(匹配1条, result)
# 返回的结果: 匹配1条 re.Match object; span(0, 4), matchgood
result2 re.findall(good, keys)
print(匹配多条并以列表的格式返回, result2)
# 返回的结果 匹配多条并以列表的格式返回 [good, good]正则表达式与爬虫结合小案例爬取豆瓣top250的图片
import re
import requests
import os
# 网页URL爬取
headers {User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36}
response requests.get(https://movie.douban.com/top250,headersheaders)
print(response.text)# img width100 alt寻梦环游记 srchttps://img2.doubanio.com/view/photo/s_ratio_poster/public/p2505426431.jpg class
title width100 alt(.*?)
zp src(.*?) class
select width100 alt(.*?) src(.*?) class
name re.findall(title, response.text)
zpUrl re.findall(zp, response.text)
ok re.findall(select, response.text)
print(name)
print(zpUrl)
print(ok)# 创建保存图片的目录
save_dir downloaded_images
if not os.path.exists(save_dir):os.makedirs(save_dir)
for i, ii in enumerate(ok):# print(i)print(f电影{ii[0]}的海报下载地址{ii[1]})# 下载图片内容img_data requests.get(ii[1]).content# 构建保存路径file_path os.path.join(save_dir, f{i1}.{ii[0]}.jpg)# 保存图片with open(file_path, wb) as file:file.write(img_data)print(fImage {i1} saved to {file_path})
else:print(Failed to retrieve the webpage)正则表达式中的 .*? 和 .* 的区别
在正则表达式中.*? 和 .* 都用于匹配任意数量的字符但它们的匹配方式有所不同。
1. .*的理解
定义.* 匹配任意数量的字符包括零个字符并且是 贪婪greedy的。贪婪模式贪婪模式会尽可能多地匹配字符。例如在字符串 abc123def 中正则表达式 a.*d 将匹配整个字符串因为 .* 会尽可能地匹配到最后的 d。示例 输入abc123def正则a.*d匹配结果abc123def
2. .*?的理解
定义.*? 同样匹配任意数量的字符包括零个字符但它是 非贪婪lazy的。非贪婪模式非贪婪模式会尽可能少地匹配字符优先匹配最短的字符串。例如在同样的字符串 abc123def 中正则表达式 a.*?d 只会匹配 ab 和 d 之间的字符结果是 abc123def 中的 a 和第一个 d 之间的最短部分。示例 输入abc123def正则a.*?d匹配结果abc123d
总结
.* 是贪婪的会尽量多地匹配字符直到最后一个符合条件的字符。.*? 是非贪婪的会尽量少地匹配字符优先返回最短的符合条件的字符串。
将爬取的图片以wb保存二进制文件 正则表达式获取豆瓣电影评分和参评人数 解析网页另一好用方法xpath
通过提问逐步理解
1.提问1:xm1和htm1分别代表什么意思?有什么区别
xml可扩展的标记语言html超文本标记语句相同点成双成对又开始有结束。区别xml的标签可以自定义语法更自由
2.提问2xpath的作用
xpath使用路径表达式在xml或html文档中查找目标信息
3.提问3如果想使用xpath必须安装哪个库(其中使用了清华镜像)
pip install lxml -i https://pypi.tuna.tsinqhua.edu.cn/simple 4.问题四: 如何构建etree树使用的网页网址为https://movie.douban.com/top250 任务4的案例源发如下
import requests
from lxml import etree# 通过读取本地下载好的网页文件再对网页内容进行解析提取
file open(demo1.html, r, encodingutf-8)
# 读取目前网页内容
content file.read()# 构建etree树后才可以使用xpath表达式
html etree.HTML(content)# 使用XPath提取图片的src属性
image_urls html.xpath(//a/img/src)# 获取电影名称
title html.xpath(//span[classtitle][1]/text())
print(title)
# 下载图片
for i, url in enumerate(image_urls):# 设置图片保存路径file_path f图片/{i}{title[i]}.webp# 下载图片response requests.get(url)if response.status_code 200:with open(file_path, wb) as f:f.write(response.content)print(f图片已下载到: {file_path})else:print(f图片下载失败: {url})效果如下