【Python3 爬虫学习笔记】基本库的使用 11—— 正则表达式 4

4. findall()

search()方法可以返回匹配正则表达式的第一个内容,但是如果想要获取匹配正则表达式的所有内容,就要借助findall()方法了。该方法会搜索整个字符串,然后返回匹配正则表达式的所有内容。
上一节中的HTML文本中,如果想要获得所有a节点的超链接、歌手和歌名,就可以将search()换成findall()方法。如果有返回结果的话,就是列表类型,所以需要遍历一下来一次获取每组内容。
代码如下:

import re

results = re.findall('<li.*?href="(.*?)".*?singer="(.*?)">(.*?)</a>', html, re.S)
print(results)
print(type(results))
for result in results:
     print(result)
     print(result[0], result[1], result[2])

运算结果如下:

[('/2.mp3', '任贤齐', '沧海一声笑'), ('/3.mp3', '齐秦', '往事随风'), ('/4.mp3', 'beyond', '光辉岁月'), ('/5.mp3', '陈慧 琳', '记事本'), ('/6.mp3', '邓丽君', '但愿人长久')]
<class 'list'>
('/2.mp3', '任贤齐', '沧海一声笑')
/2.mp3 任贤齐 沧海一声笑
('/3.mp3', '齐秦', '往事随风')
/3.mp3 齐秦 往事随风
('/4.mp3', 'beyond', '光辉岁月')
/4.mp3 beyond 光辉岁月
('/5.mp3', '陈慧琳', '记事本')
/5.mp3 陈慧琳 记事本
('/6.mp3', '邓丽君', '但愿人长久')
/6.mp3 邓丽君 但愿人长久

可以看到,返回的列表中的每个元素都是元组类型,我们用对应的索引一次取出即可。

5. sub()

除了使用正则表达式提取信息外,有时候还需要借助它来修改文本,比如,想要把一串文本中的所有数字都去掉,如果只用字符串的replace()方法,那就太繁琐了,这时可以借助sub()方法。示例如下:

import re

content = '54aK54yr5oiR54ix5L2g'
content = re.sub('\d+', '', content)
print(content)

运行结果如下:

aKyroiRixLg

这里只需要给第一个参数传入\d+来匹配所有的数字,第二个参数为替换成的字符串(如果去掉该参数的话,可以赋值为空),第三个参数是原字符串。
在上面的HTML文本中,如果想获取所有li节点的歌名,直接用正则表达式来提取可能比较烦琐。
可以先用sub()方法将a节点去掉,只留下文本,然后再利用findall()提取就好了:

html = re.sub('<a.*?>|</a>', '', html)
print(html)
results = re.findall('<li.*?>(.*?)</li>', html, re.S)
for result in results:
    print(result.strip())

运行结果如下:

 <div id="songs-list">
<h2 class="title">经典老歌</h2>
<p class="introduction">
经典老歌列表
</p>
<ul id="list" class="list-group">
<li data-view="2">一路上有你</li>
<li data-view="7">
沧海一声笑
</li>
<li data-view="4" class="active">
往事随风
</li>
<li data-view="6">光辉岁月</li>
<li data-view="5">记事本</li>
<li data-view="5">
但愿人长久
</li>
</ul>
</div>
一路上有你
沧海一声笑
往事随风
光辉岁月
记事本
但愿人长久

可以看出,a节点经过sub()方法处理后就没有了,然后再通过findall()方法提取即可。可以看到,在适当的时候,借助sub()方法可以起到事半功倍的效果。

猜你喜欢

转载自blog.csdn.net/htsait4113/article/details/82793599