python爬虫学习23
三、正则表达式
4. findall 方法
之前我们学习了search与match方法各自的作用与不足,昨天的学习中我们知道在使用search方法后,可以有效避免match方法必须从开头匹配字符串的不足,但是search本身也有很大的缺陷,即只能找到第一个符合条件的结果。
这个时候我们若想要匹配出所有可能的结果,就需要用到findall(从字面意义上看,我们就能很直观地知道这个方法是干什么的)
把昨天的html文本拿过来,依旧匹配其中所有的小说类别
<div class="nav">
<ul>
<li><a href="https://www.qbiqu.com/">首页</a></li>
<li><a href="/modules/article/bookcase.php">我的书架</a></li>
<li><a href="/xuanhuanxiaoshuo/">玄幻小说</a></li>
<li><a href="/xiuzhenxiaoshuo/">修真小说</a></li>
<li><a href="/dushixiaoshuo/">都市小说</a></li>
<li><a href="/chuanyuexiaoshuo/">穿越小说</a></li>
<li><a href="/wangyouxiaoshuo/">网游小说</a></li>
<li><a href="/kehuanxiaoshuo/">科幻小说</a></li>
<li><a href="/paihangbang/">排行榜单</a></li>
<li><a href="/wanben/1_1">完本小说</a></li>
<li><a href="/xiaoshuodaquan/">全部小说</a></li>
<li><script type="text/javascript">yuedu();</script></li>
</ul>
</div>
<div id="banner" style="display:none"></div>
<div class="dahengfu"><script type="text/javascript">list1();</script></div>
应用findall方法:
import re
html = """
<div class="nav">
<ul>
<li><a href="https://www.qbiqu.com/">首页</a></li>
<li><a href="/modules/article/bookcase.php">我的书架</a></li>
<li><a href="/xuanhuanxiaoshuo/">玄幻小说</a></li>
<li><a href="/xiuzhenxiaoshuo/">修真小说</a></li>
<li><a href="/dushixiaoshuo/">都市小说</a></li>
<li><a href="/chuanyuexiaoshuo/">穿越小说</a></li>
<li><a href="/wangyouxiaoshuo/">网游小说</a></li>
<li><a href="/kehuanxiaoshuo/">科幻小说</a></li>
<li><a href="/paihangbang/">排行榜单</a></li>
<li><a href="/wanben/1_1">完本小说</a></li>
<li><a href="/xiaoshuodaquan/">全部小说</a></li>
<li><script type="text/javascript">yuedu();</script></li>
</ul>
</div>
<div id="banner" style="display:none"></div>
<div class="dahengfu"><script type="text/javascript">list1();</script></div>
"""
result = re.findall('href.*?xiaoshuo/">(.*?)<', html, re.S)
print(type(result))
i = 0
for item in result:
print(i, ':', item)
i += 1
运行结果:
如果正则表达式中出现匹配多个目标的情况:
import re
html = """
<div class="nav">
<ul>
<li><a href="https://www.qbiqu.com/">首页</a></li>
<li><a href="/modules/article/bookcase.php">我的书架</a></li>
<li><a href="/xuanhuanxiaoshuo/">玄幻小说</a></li>
<li><a href="/xiuzhenxiaoshuo/">修真小说</a></li>
<li><a href="/dushixiaoshuo/">都市小说</a></li>
<li><a href="/chuanyuexiaoshuo/">穿越小说</a></li>
<li><a href="/wangyouxiaoshuo/">网小说</a></li>
<li><a href="/kehuanxiaoshuo/">科幻小说</a></li>
<li><a href="/paihangbang/">排行榜单</a></li>
<li><a href="/wanben/1_1">完本小说</a></li>
<li><a href="/xiaoshuodaquan/">全部小说</a></li>
<li><script type="text/javascript">yuedu();</script></li>
</ul>
</div>
<div id="banner" style="display:none"></div>
<div class="dahengfu"><script type="text/javascript">list1();</script></div>
"""
result = re.findall('href.*?/(.*?)/">(.*?)<', html, re.S)
print(type(result))
i = 0
for item in result:
print(i, ':', item)
i += 1
运行结果:每一个匹配的结果会构成一个元组再与其他结果形成一个列表
5. sub
在基础的查询操作上,若我们想对字符串进行修改,就需要用到sub方法
import re
content = 'as5af6fa5fa6fsfa'
result = re.sub('\d+', '', content)
print(result)
运行结果:
又回到之前的html文本,如果我们想要获取其中所有的中文,直接写一个正则就可能会很麻烦(当然这里其实很简单),这时候我们可以用sub与findall搭配使用:
import re
html = """
<div class="nav">
<ul>
<li><a href="https://www.qbiqu.com/">首页</a></li>
<li><a href="/modules/article/bookcase.php">我的书架</a></li>
<li><a href="/xuanhuanxiaoshuo/">玄幻小说</a></li>
<li><a href="/xiuzhenxiaoshuo/">修真小说</a></li>
<li><a href="/dushixiaoshuo/">都市小说</a></li>
<li><a href="/chuanyuexiaoshuo/">穿越小说</a></li>
<li><a href="/wangyouxiaoshuo/">网游小说</a></li>
<li><a href="/kehuanxiaoshuo/">科幻小说</a></li>
<li><a href="/paihangbang/">排行榜单</a></li>
<li><a href="/wanben/1_1">完本小说</a></li>
<li><a href="/xiaoshuodaquan/">全部小说</a></li>
<li><script type="text/javascript">yuedu();</script></li>
</ul>
</div>
<div id="banner" style="display:none"></div>
<div class="dahengfu"><script type="text/javascript">list1();</script></div>
"""
result = re.sub('<a.*?>', '', html, re.S)
print(result)
result1 = re.findall('<li>(.*?)</a>', result, re.S)
for item in result1:
print(item)
使用sub后的结果:
在这基础上,我们的正则匹配的结果:
6. compile
compile方法可以将正则字符串编译成正则表达式对象:
import re
text1 = '2020-03-28 20:00'
pattern = re.compile('\d{2}:\d{2}', re.S)
result = re.sub(pattern, '', text1)
print(result)
运行结果:
至此我们对于正则表达式的相关内容已经学习完了,是不是感觉我们的知识体系又充实了一大部分?
今日结束,未完待续…
|