1. 程式人生 > >【Python3 爬蟲學習筆記】基本庫的使用 11—— 正則表示式 4

【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()方法可以起到事半功倍的效果。