06_正则案例实战/01_正则01.py:
"""
1. re.compile 正则表达式语法
2. re.search 找一个
3. re.match 从头找一个,没有返回None
4. re.findall 找所有 返回列表
. 匹配任意字符,除了换行符,re.DOTALL标记被指定时,则可以匹配包括换行符的任意字符
* 匹配0个或多个的表达式
+ 匹配1个或多个的表达式
? 匹配0个或1个由前面的正则表达式定义的片段,非贪婪方式
[] 表示一组字符。
"|" A|B,创建一个正则,将匹配A或B
\ 转义
\s 匹配任何空白字符
\d 匹配任何数字
"""
import re
# 正则的内容一般是网页,而网页一般是以双引号形式显示,所以我们需要用单引号包裹
str1 = '<link rel="search" type="application/opensearchdescription+xml" href="/content-search.xml" title="百度搜索1" title="百度搜索2" />'
result1 = re.findall('title="(.*?)"',str1) # findall返回的是list
print(result1) # 打印['百度搜索1', '百度搜索2'] 非贪婪模式
result2 = re.findall('title="(.*)"',str1) # findall返回的是list
print(result2) # 打印['百度搜索1" title="百度搜索2'] 贪婪模式
result3 = re.findall('<link rel="search" type="application/opensearchdescription\+xml" href="/content-search\.xml" title="(.*?)" title="(.*?)" />',str1)
print(result3) # 打印[('百度搜索1', '百度搜索2')]
print('\n') # 打印换行
print('\\n') # 打印\n
06_正则案例实战/02_正则02.py:
import re
str1 = """
<html>
<body>
<p>python1</p>
<p>python2</p>
<p>python3</p>
<p>python4</p>
<div>
Line 1
</div>
</body>
</html>
"""
result1 = re.findall('<p>(.*?)</p>',str1)
print(result1) # 打印['python1', 'python2', 'python3', 'python4']
# 因为<div>Line1</div>之间有换行,所以需要使用re.S方法
result2 = re.findall('<div>(.*?)</div>',str1,re.S)
print(result2) # ['\n Line 1\n ']
# 使用了re.S方法以后,有换行符的出现,所以我们需要加[0]
result3 = re.findall('<div>(.*?)</div>',str1,re.S)[0]
print(result3)
# 用strip()去掉空格
result4 = re.findall('<div>(.*?)</div>',str1,re.S)[0].strip()
print(result4) # Line 1
06_正则案例实战/03_获取免费代理.py:
from requests_html import HTMLSession
import re
session = HTMLSession()
response = session.get(url="https://www.zmhttp.com/")
# 解决乱码
response.encoding = response.apparent_encoding
html = response.text
# list = re.findall('<td><span class="slogan">FREE</span>(.*?)</td>.*?<td>(.*?)</td>.*?<td>(.*?)</td>.*?<td>(.*?)</td>.*?<td>(.*?)</td>.*?<td>(.*?)</td>',html,re.S)
# 推荐写法
list = re.findall('<td><span class="slogan">FREE</span>(.*?)</td>\s*<td>(.*?)</td>\s*<!--<td>(.*?)</td>-->\s*<td>(.*?)</td>\s*<td>(.*?)</td>\s*<td>(.*?)</td>\s*<td>(.*?)</td>',html,re.S)
print(list)
# print(html)
06_正则案例实战/04_B站无水印视频提取.py:
"""
思路顺序:
1.先分析初始页面、源码
2.如果初始页面没有,name数据肯定存在于XHR或者JS当中
3.如果2中还是没有,那么数据肯定进行了加密处理,此时就要进行JS破解
如果页面中有我们想要的数据,那么这个数据肯定以某种方式存在或传递,只不过传递的方法不同
"""
from requests_html import HTMLSession
import re
session = HTMLSession()
url = "https://m.bilibili.com/video/av628324550?from=search&seid=10458801577147007046&spm_id_from=333.337.0.0"
headers = {
'user-agent':'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.102 Mobile Safari/537.36'
}
response = session.get(url=url,headers=headers)
html = response.text
result = re.findall("readyVideoUrl: '(.*?)'",html)
# print(result)
videoUrl = result[0]
videoTitle = re.findall("<h1>(.*?)</h1>",html)[0]
video_response = session.get(url=videoUrl,headers=headers)
with open('./video/{}.mp4'.format(videoTitle),'wb') as fp:
fp.write(video_response.content)
print("----{}下载完成!----".format(videoTitle))
06_正则案例实战/05_斗鱼.py:
import re
from requests_html import HTMLSession
session = HTMLSession()
url = "https://www.douyu.com/g_LOL"
response = session.get(url=url)
html = response.text
nn_list = re.findall('"nn":"(.*?)"',html)
print(nn_list)
# zb_list = re.findall('"nn":"(.*?)","oaid":0,"od":"(.*?)","ol":(.*?),"ot":0,"rgrpt":1,"rid":252140,"rn":"(.*?)"',html)
# print(zb_list)
文章到这里就结束了!希望大家能多多支持Python(系列)!六个月带大家学会Python,私聊我,可以问关于本文章的问题!以后每天都会发布新的文章,喜欢的点点关注!一个陪伴你学习Python的新青年!不管多忙都会更新下去,一起加油!
Editor:Lonelyroots
网友评论