一、类class
类(class)
方法:类中定义函数
类的构造方法__init__()
实例变量
实例化:根据类生成对象的过程
继承
1.Python类class
属性
方法
# Myclass家族,但是这个家族只有一个人people
class Myclass:
"""一个简简单单的实例"""
i = 12345
def people(self):
return 'i love you'
#实例化类
x = Myclass() #家族名称
#访问类的属性和方法
print('Myclass 类的属性 i 为:',x.i)#家族名称x+物品名称i
print('Myclass 类的方法 people 为:',x.people())#家族名称x+人名people
结果:
Myclass 类的属性 i 为: 12345
Myclass 类的方法 people 为: i love you
2.类的构造方法__init__()
class Complex:
def __init__(self,realpart,imagpart): #必须要有一个self参数
self.r = realpart
self.i = imagpart
x = Complex(3.0,-4.5)
print(x.r,x.i)
结果:3.0 -4.5
3.每次执行一次类的属性+1
class Student:
# 类属性
num = 0
# 构造函数
def __init__(self,name,score):
# self是对象
# 对象属性,实例属性
self.__name = name
self.__score = score
Student.num+=1
stu1 = Student('柳宗元',100)
print(stu1.num)
stu1 = Student('杜甫',100)
print(stu1.num)
结果:
1
2
二、模块
1.内建模块
1.内建模块
import time
import datetime
print(time.time())
print(chr(97))
print(ord('a'))
import string
import os
import re
内建模块,内置模块
第一种方法
import string #按住Ctrl点击鼠标左键就可以进入string内部
print(string.punctuation)
结果:!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~
第二种方法
from string import punctuation
print(punctuation)
结果:!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~
第三种方法
from string import punctuation as pt,whitespace as ws #whitespace空白字符,punctuation特殊字符
(1.)string 挑出里面非特殊字符的
from string import punctuation as pt,whitespace as ws
strs = "et5j2%@#%$3qdsghd\nsf hoi\tU(*%&te wt$*@(%^@$5u%@#$^ou"
lists = ''.join([x for x in strs if x not in pt+ws])
print(lists)
结果:et5j23qdsghdsfhoiUtewt5uou
(2.)os
import os
print(os.getcwd()) #可以知道当前打开文件的位置,结果:C:\Users\lenovo\Desktop\day\1023
print(os.path.isdir('test')) #判断是否是一个文件夹,结果:False
print(os.path.isfile('test.py')) #判断是否是一个文件,结果:False
print(os.listdir()) #打印出当前路径下的所有文件
print([x for x in os.listdir() if x.endswith('.py')]) #打印出当前路径下的所有以.py结尾的文件
2.第三方模块
2.第三方模块
(1.)汉字转拼音
pip install xpinyin #下载模块
from xpinyin import Pinyin
p = Pinyin()
print(p.get_pinyin('中国',' '))
结果:zhong guo
(2.)faker模拟生成数据
from faker import Faker
faker=Faker(locale="zh_CN")
for i in range(5):
print(faker.name(),faker.phone_number(),faker.address(),faker.ssn(),faker.email())
结果:
周玉兰 13637747391 山西省通辽县沙市乔路e座 545076 360828193505178193 yang06@example.com
蒋辉 15003654925 台湾省伟县蓟州廖路c座 191048 500000199804177602 ming14@example.net
黄海燕 15986887106 西藏自治区北京县友好李路V座 864844 222404197011287994 guiyingmo@example.net
何丹 13090055293 安徽省宁德市沙市郭路w座 404004 350681199011172476 junpan@example.org
庄帆 15621668361 甘肃省艳市淄川长沙路L座 766610 540221198001306779 minyuan@example.org
3.定义自己的模块
3.定义自己的模块
(1)
from aking.baby import Student
stu = Student()
stu.run()
stu.say_hello()
from aking.baby import Student
Student.run() #加了@classmethod,可以用类名直接调
Student.say_hello()
baby.py
class Student():
@classmethod #把下面的函数转成类函数,转完之后就可以用类名直接调用
def say_hello(self):
print('hello!')
@classmethod #@后面是给函数直接加一个特性
def run(self):
print('i can run')
(2)把斐波那契数列放到包里面
from aking.baby import Student
for i in Student.get_data(10):
print(i)
Python安装路径下建aking文件,里面写baby.py和__init__.py文件
baby.py
class Student():
@classmethod #把下面的函数转成类函数,转完之后就可以用类名直接调用
def say_hello(self):
print('hello!')
@classmethod #@后面是给函数直接加一个特性
def run(self):
print('i can run')
@classmethod
def get_data(self,n):
x = 0
y = 1
for i in range(n):
x,y = y,x+y
yield x
函数那块差的补上
三、装饰器wrapper:再不改变原来函数的基础上,给函数添加新的功能
1.wrapper装饰器,检测函数运行时间
def hello():
print('one two three!')
print(hello.__name__)#可以打印函数名,调用函数__name__这个属性,__name__这种叫做魔术方法,简单来说就是一类特殊方法
结果:hello
检测函数运行时间
import time
def hello():
begin = time.time()
time.sleep(3)
print('one two three!')
stop = time.time()
print(stop-begin)
hello() #调用
结果:
one two three!
3.012659788131714
两种方法结果一样
方法一
import time
def hello():
time.sleep(3)
print('one two three!')
def log(func): #参数func代表里面传入一个函数
def wrapper(*args,**kwargs):
begin = time.time()
f = func(*args,**kwargs) #实际上是调用
stop = time.time()
print(stop-begin)
return f
return wrapper #log返回的是wrapper,func相当于传入hello()这个函数,这个相当于log(hello),调用wrapper函数,
log(hello)() #log(hello)()这个相当于wrapper()
结果:
one two three!
3.015314817428589
方法二:简化方法一,加@log就可以,方法二相当于方法一
import time
def log(func):
def wrapper(*args,**kwargs): #wrapper装饰器
begin = time.time()
f = func(*args,**kwargs)
stop = time.time()
print(stop-begin)
return f
return wrapper
@log
def hello():
time.sleep(3)
print('one two three!')
hello()
结果:
one two three!
3.0092666149139404
注意:到目前为止装饰器就只考过检测时间的题
注意:到目前为止装饰器就只考过检测时间的题
四、面向对象
(1)面向对象三大特性
继承、封装、多态
(2)isinstance()方法判断是否是这个类的对象
class Dog():
pass
class YellowDog(Dog):
pass
y = YellowDog()
x = Dog()
print(isinstance(y,YellowDog)) #结果:True
print(isinstance(y,Dog)) #结果:True
print(isinstance(x,YellowDog)) ##结果:False
(3)判断数据类型
print(isinstance([1,2,3],list)) ##结果:True
(4)attrbute:属性
这是一个面试题
这是一个面试题
hasattr(实例化对象,属性)#用于判断对象是否包含对应的属性,hasattr(object,name)object对象,name字符串属性名
setattr()#设定属性值,该属性不一定是存在的,setattr(object,name,value),object对象,name字符串,对象属性,value属性值
getattr()#用于返回一个对象属性值
class Dog():
pass
class YellowDog(Dog):
def __init__(self):
self.x = 9
y = YellowDog()
print(hasattr(y,'x')) #询问实例化对象y里面有没有x这个属性,结果:True
setattr(y,'xx',20) #对象、属性、绑定20
print(hasattr(y,'xx')) #结果:True
print(getattr(y,'xx')) #结果:20
(4)__slots__方法:限制类的属性
一、可以随便绑定属性和方法
class Student(object):
pass
stu1 = Student()
stu1.age = 23
print(stu1.age)
结果:23
二、怎么可以控制不让它绑定这些属性,或者只可以绑定我认为可以绑定的?可以用__slots__方法解决这个问题。
方法一
class Student(object):
__slots__ = ('name','score','age')
#没有的属性无法改变
stu1 = Student()
stu1.age = 23
print(stu1.age)
stu1.address = '623766656655X'
print(stu1.address) #结果:AttributeError: 'Student' object has no attribute 'address'
方法二:有没有办法绕过__slots__方法?
解决方法:继承父类就可以修改
class Student(object):
__slots__ = ('name','score','age')
class Student1(Student):
pass
stu2 = Student1()
stu2.address = '623766656655X'
print(stu2.address) #结果:623766656655X
(5)设置年龄限制
class Student:
def set_age(self,age):
if age>150 or age<0:
raise ValueError('年龄不符合要求') #人为报错
else:
self.__age = age #设置年龄
def show_age(self):
print(self.__age)
stu = Student()
stu.set_age(60)
stu.show_age()
结果:60
(6)设置年龄限制改良版本
class Student:
@property #装饰器 这个叫告诉你绑定age这个属性
def age(self):
return self._age
@age.setter #装饰器,内部通过这种特殊的装饰器,可以设置他的属性限制,写法比较固定,@property和@age.setter是一个组合
def age(self,value):
if value>150 or value<0:
raise ValueError('age在0~150之间')
self._age = value
stu = Student()
stu.age = 60
print(stu.age)
结果:60
注解版本
class Student:
#假如只暴露age()函数,表示当前这个属性只允许读,不允许修改
@property #把age属性暴露出去,函数名字就是属性名字
def age(self):
return self._age
@age.setter #当前age属性允许修改(赋值),其实真正的属性是_age
def age(self,value):
if value>150 or value<0:
raise ValueError('age在0~150之间')
self._age = value
stu = Student()
stu.age = 60 #age属性可以读也可以写
print(stu.age)
结果:60
(7)多态、鸭子类型
鸭子类型
这块是固定死的,要接一个动物对象
def run_twice(animal): #定义了一个函数,这里面将会传进来一个animal对象,然后这个对象将会被调用两次,调用的是run()方法
animal.run()
animal.run()
#而这就是一个开辟原则,可以添加开放,但是不允许你再修改了,而下面你可以添加更多的对象这个就体现了他的一个扩展性
class Dog: #定义Dog对象
def run(self):
print('dog is running')
class Cat:
def run(self):
print('cat is running')
dog1 = Dog()
cat1 = Cat()
run_twice(dog1)
run_twice(cat1)
#这里面你可以添加更多的类,我们所要关心的就是怎么把这个类写好,而不再去关心run_twice里面写的是什么东西
class Rabbit:
def run(self): #只要类下面定义了run(self)就可以传,只要有这个属性就行
print('rabbit is jumpping')
rabbit1 = Rabbit()
run_twice(rabbit1)
结果:
dog is running
dog is running
cat is running
cat is running
rabbit is jumpping
rabbit is jumpping
多态的修改原则
上面的内容你不可以动,你所要做的就是根据他给你的规则,去定义更多的类,生成更多的对象,这个就是一个多态的体现。
Python是一个动态语言,动态语言有更多的灵活性,只要能跑就可以传进来,不像是Java定了动物类,就必须传进来动物类的,Python哪怕是一个吸尘器,
只要他能动,有跑这个方法,就可以传进来用,这涉及到一个什么概念呢?有一个叫鸭子类型,在动态语言里面他才可以用,意思就是:
一个东西它看起来像鸭子,走起路来像鸭子,我们就可以把它当成鸭子来用,这就是动态语言的灵活性。
后期再将单例模式,元类就是定义类的类,元类之所有用就是可以动态生成这些类,刷面试题的时候再讲,应付面试用的。
五、正则表达式基础知识
(通俗来说就是我制定的规则)作用:1.按照规则抽取东西,数据抽取。2.过滤、筛选。
import re
1.正则规则分成三部分
(1)一部分
\w 数字、字母、下划线、汉字
\s 空白字符
\d 数字
\D 非数字,其他相同,大写取反
. 代表除了换行之外的所有东西
(2)二部分
+ 一个或多个
* 0个或多个
(3)三部分
模式:分为贪婪和非贪婪
(I.)
贪婪:省略不写是贪婪
strs = "et25j%@#%$3qd____sghd\nsf hoi\tU(*w%&te wSDFSDFt$*@(%^是个DFS帅哥@$5u%@#$^ou"
result = re.findall('\w+',strs)
结果:['et25j', '3qd____sghd', 'sf', 'hoi', 'U', 'w', 'te', 'wSDFSDFt', '是个DFS帅哥', '5u', 'ou']
(II.)
非贪婪: ?
strs = "et25j%@#%$3qd____sghd\nsf hoi\tU(*w%&te wSDFSDFt$*@(%^是个DFS帅哥@$5u%@#$^ou"
result = re.findall('\w+?',strs)
结果:['e', 't', '2', '5', 'j', '3', 'q', 'd', '_', '_', '_', '_', 's', '
strs = "et25j%@#%$3qd____sghd\nsf hoi\tU(*w%&te wSDFSDFt$*@(%^是个DFS帅哥@$5u%@#$^ou"
第一部分定制变化
result = ''.join(re.findall('\w+',strs)) #剔除里面的特殊字符,取出数字字母下划线汉字
结果:et25j3qd____sghdsfhoiUwtewSDFSDFt是个DFS帅哥5uou
result = re.findall('\s+',strs) #取出空白字符
结果:['\n', ' ', '\t', ' ']
result = re.findall('\d+',strs) #取出数字
结果:['25', '3', '5']
result = re.findall('\D+',strs) #取出非数字,
结果:['et', 'j%@#%$', 'qd____sghd\nsf hoi\tU(*w%&te wSDFSDFt$*@(%^是个DFS帅哥@$', 'u%@#$^ou']
result = re.findall('[a-zA-Z]+',strs) #取出字母,只要字母,自己指定规则,
结果:['et', 'j', 'qd', 'sghd', 'sf', 'hoi', 'U', 'w', 'te', 'wSDFSDFt', 'DFS', 'u', 'ou']
result = re.findall('[a-zA-Z0-9]+',strs) #取出数字字母
result = re.findall('[a-zA-Z\d]+',strs) #取出数字字母
结果:['et25j', '3qd', 'sghd', 'sf', 'hoi', 'U', 'w', 'te', 'wSDFSDFt', 'DFS', '5u', 'ou']
result = re.findall('[a-zA-Z\d%]+',strs) #取出数字字母和%
结果:['et25j%', '%', '3qd', 'sghd', 'sf', 'hoi', 'U', 'w%', 'te', 'wSDFSDFt', '%', 'DFS', '5u%', 'ou']
result = re.findall('[^a-zA-Z\d%]+',strs) #不要数字字母和%,取反符号^
结果:['@#', '$', '____', '\n', ' ', '\t', '(*', '&', ' ', '$*@(', '^是个', '帅哥@$', '@#$^']
result = re.findall('.*',strs) # .代表除了换行符外的所有东西
结果:['et25j%@#%$3qd____sghd', '', 'sf hoi\tU(*w%&te wSDFSDFt$*@(%^是个DFS帅哥@$5u%@#$^ou', '']
第二部分,+变化成为*
result = re.findall('[^a-zA-Z\d%]*',strs) # *代表0个或多个,e不符合要求,但是*认为十符合要求0个,所以取它取个空的下来
结果:['', '', '', '', '', '', '@#', '', '$', '', '', '', '____', '', '', '', '', '\n', '', '',
自己制定数量
result = re.findall('\w{2,4}',strs) #{2,4}取2个以上到4个的
结果:['et25', '3qd_', '___s', 'ghd', 'sf', 'hoi', 'te', 'wSDF', 'SDFt', '是个DF', 'S帅哥', '5u', 'ou']
result = re.findall('\w{2,}',strs) #{2,}取2个以上的
结果:['et25j', '3qd____sghd', 'sf', 'hoi', 'te', 'wSDFSDFt', '是个DFS帅哥', '5u', 'ou']
result = re.findall('DFS(\w+)@\$5',strs) #\$有特殊含义,需要转义,要帅哥两个汉字,它在DFS后面,@\$5前边
结果:['帅哥']
result = re.findall(' (\w+)\tU',strs)
print(result)
结果:['hoi']
1.把字符串里面的数字换成大写的A
import re
strs = 'dgfsgsfg3214sfgsdh232dfg535'
result = re.sub('\d+?','A',strs)
print(result)
结果:dgfsgsfgAAAAsfgsdhAAAdfgAAA
2.用正则匹配出标签里面的内容(“中国”),其中class的类名是不确定的
方法一
import re
source = '<div class="nam">中国</div>'
demo = re.compile('<div class="\w+">(\w+)</div>')
result = demo.findall(source)
print(result)
结果:['中国']
方法二
import re
str = '<div class="nam">中国</div>'
result = re.findall(r'<div class=".*">(.*?)</div>',str)
print(result)
结果:['中国']
方法三
re.complie是将正则表达式编译成一个对象,加快速度并重复使用
import re
title = "你好,hello,世界!"
res = re.compile(r'[\u4e00-\u9fa5]+')
result = res.findall(title)
print(result)
结果:['你好', '世界']
3.== 正则表达式转义 ==
Python正则表达式前的 r 表示原生字符串(rawstring),该字符串声明了引号中的内容表示该内容的原始含义,避免了多次转义造成的反斜杠困扰。
关于反斜杠困扰:与多数编程语言相同,正则表达式中使用“\”作为转义字符,如果需要匹配文本中的字符“\”,在正则表达式中需要4个“\”,
首先,前2个“\”和后两个“\”在python解释器中分别转义成一个“\”,然后转义后的2个“\”在正则中被转义成一个“\”。
#python解释器转义
string = "d:\\abc\\n"
print(string) #结果:d:\abc\n
#python解释器转义后,正则转义
import re
tran_string1 = re.match("d:\\\\",string).group()
print(tran_string1) #结果:d:\
#原生字符串表示不在需要解释器再转义,直接接受正则转义
tran_string2 = re.match(r"d:\\",string).group()
print(tran_string2) #结果:d:\
4.==findall结果无需加 group(),search()需要加group() ==提取
import re
s = '<imng data-original="https://rpic.douyucdn.cn/appCovers/2016/11/13/124871_23424435_small.jpg"'\
'src="https://rpic.douyucdn.cn/appCovers/2016/11/13/124871_23424435_small.jpg" style="display: incline;">'
#re.findall在字符串中找到正则表达式所匹配的所有子串,并返回一个列表,如果没有找到匹配的,则返回空列表
#注意: match和search是匹配一次,findall匹配所有。
res = re.findall(r"https://.*?.jpg",s)[0]
print(res)
结果:
https://rpic.douyucdn.cn/appCovers/2016/11/13/124871_23424435_small.jpg
#re.search扫描整个字符串并返回第一个成功的匹配。匹配成功re.search方法返回一个匹配的对象,否则返回None。
res = re.search(r"https://.*?.jpg",s)
print(res.group())
结果:
https://rpic.douyucdn.cn/appCovers/2016/11/13/124871_23424435_small.jpg
5.match()和search()都是python中正则匹配函数,那这两个函数有何区别呢?
(1)match()函数只检测re是不是在string的开始位置匹配,search()会扫描整个string查找匹配,也就是说match()只有在0位置匹配成功的话,
才有返回,如果不是开始位置匹配成功的话,match()就返回none。
import re
text = 'pythontab'
m = re.match(r"\w+",text)
if m:
print(m.group(0))
else:
print('not match')
结果:pythontab
import re
text = '@pythontab'
m = re.match(r'\w+',text)
if m:
print(m.group(0))
else:
print('not match')
结果:not match
(2)search()会扫描整个字符串并返回第一个陈工的匹配
import re
text = 'pythontab'
m = re.search(r'\w+',text)
if m:
print(m.group(0))
else:
print('not match')
结果:pythontab
# 那这样呢?
import re
text = '@pythontab'
m = re.search(r'\w+',text)
if m:
print(m.group(0))
else:
print('not match')
结果:pythontab
6.爬取顶点小说
strs = """
<div class="l">
<h2>最近更新小说列表</h2>
<ul>
<li><span class="s1">[网游动漫]</span><span class="s2"><a href="https://www.23wx.cc/du/198/198378/" target="_blank">我在黄泉当教主</a></span><span class="s3"><a href="/du/198/198378/59319850.html" target="_blank">第四百八十八章 战斗</a></span><span class="s4">三百斤的微笑</span><span class="s5">10-23</span></li>
<li><span class="s1">[都市言情]</span><span class="s2"><a href="https://www.23wx.cc/du/211/211313/" target="_blank">香江新豪门</a></span><span class="s3"><a href="/du/211/211313/59319846.html" target="_blank">第479章 【大投资大计划】</a></span><span class="s4">任猪飞</span><span class="s5">10-23</span></li>
<li><span class="s1">[科幻小说]</span><span class="s2"><a href="https://www.23wx.cc/du/178/178185/" target="_blank">我成帝了金手指才来</a></span><span class="s3"><a href="/du/178/178185/59319845.html" target="_blank">第2083章 拿捏</a></span><span class="s4">天涯月照今</span><span class="s5">10-23</span></li>
<li><span class="s1">[玄幻魔法]</span><span class="s2"><a href="https://www.23wx.cc/du/210/210206/" target="_blank">大秦:我杀敌就能变强</a></span><span class="s3"><a href="/du/210/210206/59319844.html" target="_blank">第327章 分封,郡县</a></span><span class="s4">陈喵呜</span><span class="s5">10-23</span></li>
<li><span class="s1">[科幻小说]</span><span class="s2"><a href="https://www.23wx.cc/du/197/197947/" target="_blank">全球高武:刷怪成神,我打穿了人类禁区</a></span><span class="s3"><a href="/du/197/197947/59319842.html" target="_blank">第三百九十五章 国外</a></span><span class="s4">离歌啊</span><span class="s5">10-23</span></li>
<li><span class="s1">[玄幻魔法]</span><span class="s2"><a href="https://www.23wx.cc/du/190/190463/" target="_blank">我在精神病院学斩神</a></span><span class="s3"><a href="/du/190/190463/59319843.html" target="_blank">第1366章 「英灵」</a></span><span class="s4">三九音域</span><span class="s5">10-23</span></li>
<li><span class="s1">[玄幻魔法]</span><span class="s2"><a href="https://www.23wx.cc/du/229/229772/" target="_blank">大明:天下第一皇商</a></span><span class="s3"><a href="/du/229/229772/59319839.html" target="_blank">第104章 奇迹</a></span><span class="s4">月河倒影</span><span class="s5">10-23</span></li>
<li><span class="s1">[科幻小说]</span><span class="s2"><a href="https://www.23wx.cc/du/198/198247/" target="_blank">异维度游戏</a></span><span class="s3"><a href="/du/198/198247/59319838.html" target="_blank">第302章 “紫气东来”法诀</a></span><span class="s4">最终永恒</span><span class="s5">10-23</span></li>
<li><span class="s1">[女频小说]</span><span class="s2"><a href="https://www.23wx.cc/du/194/194865/" target="_blank">宠婚入骨</a></span><span class="s3"><a href="/du/194/194865/59319837.html" target="_blank">第 771 章:明城清欢(5)</a></span><span class="s4">妖妖逃之</span><span class="s5">10-23</span></li>
<li><span class="s1">[都市言情]</span><span class="s2"><a href="https://www.23wx.cc/du/108/108181/" target="_blank">特战之王</a></span><span class="s3"><a href="/du/108/108181/59319836.html" target="_blank">第四百八十三章:百分之八</a></span><span class="s4">小舞</span><span class="s5">10-23</span></li>
<li><span class="s1">[玄幻魔法]</span><span class="s2"><a href="https://www.23wx.cc/du/230/230002/" target="_blank">最强减命系统之生命主宰</a></span><span class="s3"><a href="/du/230/230002/59319835.html" target="_blank">第97章 秘境规则</a></span><span class="s4">白木香</span><span class="s5">10-23</span></li>
<li><span class="s1">[玄幻魔法]</span><span class="s2"><a href="https://www.23wx.cc/du/225/225287/" target="_blank">极品风流假太监</a></span><span class="s3"><a href="/du/225/225287/59319834.html" target="_blank">第291章 代理主簿</a></span><span class="s4">火王之王</span><span class="s5">10-23</span></li>
<li><span class="s1">[都市言情]</span><span class="s2"><a href="https://www.23wx.cc/du/67/67422/" target="_blank">女总裁的全能兵王</a></span><span class="s3"><a href="/du/67/67422/59319829.html" target="_blank">第5138章 谁忽悠谁</a></span><span class="s4">寂寞的舞者</span><span class="s5">10-23</span></li>
<li><span class="s1">[玄幻魔法]</span><span class="s2"><a href="https://www.23wx.cc/du/194/194937/" target="_blank">午夜跑腿员</a></span><span class="s3"><a href="/du/194/194937/59319827.html" target="_blank">第四百一十八章 破天主宰</a></span><span class="s4">若南五</span><span class="s5">10-23</span></li>
<li><span class="s1">[侦探推理]</span><span class="s2"><a href="https://www.23wx.cc/du/223/223596/" target="_blank">收尸档案</a></span><span class="s3"><a href="/du/223/223596/59319826.html" target="_blank">第108章:绿毛僵尸</a></span><span class="s4">张无忍</span><span class="s5">10-23</span></li>
<li><span class="s1">[玄幻魔法]</span><span class="s2"><a href="https://www.23wx.cc/du/230/230212/" target="_blank">绝品驸马爷</a></span><span class="s3"><a href="/du/230/230212/59319825.html" target="_blank">第131章 语出惊人</a></span><span class="s4">厌笔川</span><span class="s5">10-23</span></li>
<li><span class="s1">[都市言情]</span><span class="s2"><a href="https://www.23wx.cc/du/4/4626/" target="_blank">护花高手在都市</a></span><span class="s3"><a href="/du/4/4626/59319822.html" target="_blank">第2947章 就算是神的命也无常</a></span><span class="s4">心在流浪</span><span class="s5">10-23</span></li>
<li><span class="s1">[历史军事]</span><span class="s2"><a href="https://www.23wx.cc/du/41/41153/" target="_blank">花豹突击队</a></span><span class="s3"><a href="/du/41/41153/59319820.html" target="_blank">第五千九百五十章 不可避免</a></span><span class="s4">竹香书屋</span><span class="s5">10-23</span></li>
<li><span class="s1">[历史军事]</span><span class="s2"><a href="https://www.23wx.cc/du/190/190059/" target="_blank">长安之上</a></span><span class="s3"><a href="/du/190/190059/59319819.html" target="_blank">第973章 竟然如此不堪吗</a></span><span class="s4">迪巴拉爵士</span><span class="s5">10-23</span></li>
<li><span class="s1">[都市言情]</span><span class="s2"><a href="https://www.23wx.cc/du/193/193596/" target="_blank">我在1982有个家</a></span><span class="s3"><a href="/du/193/193596/59319818.html" target="_blank">番外2:合作边疆办冷库(上)</a></span><span class="s4">全金属弹壳</span><span class="s5">10-23</span></li>
<li><span class="s1">[玄幻魔法]</span><span class="s2"><a href="https://www.23wx.cc/du/176/176062/" target="_blank">极道武学修改器</a></span><span class="s3"><a href="/du/176/176062/59319817.html" target="_blank">第1337章 线索中断</a></span><span class="s4">南方的竹子</span><span class="s5">10-23</span></li>
</ul>
</div>
"""
result = re.findall('<li><span class="s1">\[(.*?)\]</span><span class="s2"><a href=".*?" target="_blank">(\w+)</a></span><span class="s3"><a href=".*?" target="_blank">(.*?)</a></span><span class="s4">(\w+)</span><span class="s5">(.*?)</span></li>.*?',strs)
# result = re.findall('<li><span class="s1">\[(.*?)\]</span><span class="s2"><a href=".*?" target="_blank">(\w+)</a></span><span class="s3"><a href=".*?" target="_blank">(.*?)</a></span><span class="s4">(\w+)</span><span class="s5">(\d{2}-\d{2})</span></li>.*?',strs)
#\[(.*?)\]需要转义,应为[]是正则里面制定规则的符号
for type,title,chapter,author,date in result:
print(type,title,chapter,author,date)