Python(六十七)正则案例实战

2022-02-26  本文已影响0人  Lonelyroots

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

上一篇下一篇

猜你喜欢

热点阅读