【Python3 爬蟲學習筆記】基本庫的使用 11—— 正則表示式 4
阿新 • • 發佈:2018-11-11
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()方法可以起到事半功倍的效果。