第2章
金融資料挖掘之爬蟲技術基礎
“工欲善其事,必先利其器。”在進行金融資料挖掘項目實戰之前,先來學習資料挖掘的一個技術手段—爬蟲技術。爬蟲技術其實就是利用計算機程式模拟人來通路網頁,同時将網頁上的資料擷取下來,為資料的進一步分析做準備。
2.1 爬蟲技術基礎1—網頁結構基礎
想要從網頁上挖掘資料,首先得對網頁結構有一些基本的了解。本節會由淺入深地為大家揭開日常通路的網頁背後的知識點。
2.1.1 檢視網頁源代碼—F12鍵
學習網絡爬蟲技術首先得有一個浏覽器,這裡推薦谷歌浏覽器(官網下載下傳位址為
https://www.google.cn/chrome/)。當然用其他浏覽器也可以,如火狐浏覽器等,隻要按F12鍵(有的計算機要同時按住左下角的Fn鍵)能彈出網頁源代碼即可。
下面以谷歌浏覽器為例來示範F12鍵的強大作用。在谷歌浏覽器中使用百度搜尋“阿裡巴巴”,然後按F12鍵,在網頁下方彈出如下圖所示的界面。
按F12鍵後彈出來的界面稱為開發者工具,是進行網絡資料挖掘的利器。對于爬蟲技術來說,隻需要會用下圖所示的兩個功能即可。
第一個是“選擇”按鈕,第二個是“Elements(元素)”頁籤。
1.“選擇”按鈕
單擊“選擇”按鈕,會發現按鈕變成藍色,然後在上方的網頁中移動滑鼠,滑鼠指針所指向的網頁元素的顔色會發生變化,“Elements”頁籤裡的内容也會随之改變。例如,指向搜尋到的第一個連結的标題,顯示效果如下圖所示。
當“選擇”按鈕處于藍色狀态時,在上方的網頁中單擊第一個連結的标題,這時“選擇”按鈕變回灰色,而“Elements”頁籤裡的内容也不再變動,我們就可以開始觀察單擊的标題對應的網頁源代碼的具體内容了。我們一般隻關心裡面的中文内容,如果沒看到中文文本,單擊下圖所示的三角箭頭,即可展開内容,看到中文文本。
2.“Elements”頁籤
“Elements”頁籤裡面的内容可以了解為就是網頁的源代碼,最後爬蟲爬到的内容大緻就是這樣。下面接着完成一些“神奇”的操作。
如下圖所示,輕按兩下“阿裡巴巴”文本,這幾個字會變成可編輯狀态。
把“阿裡巴巴”改成“工作”,然後同樣輕按兩下下面一行的“批發網站_上”文本,使它變成可編輯狀态,删除其中的“批發網站”,可以看到上方網頁中的連結标題也相應地改變,如下圖所示。
還可以用同樣的操作,修改頁面上的其他資訊,如股價等。
通過開發者工具,我們可以對網頁的結構有一個初步的認識,并利用“選擇”按鈕和“Elements”頁籤觀察我們想擷取的内容在源代碼中的文本格式及所在位置。
2.1.2 檢視網頁源代碼—右鍵菜單
在網頁上右擊,然後在彈出的快捷菜單中選擇“檢視網頁源代碼”指令,如右圖所示,也會彈出一個目前網頁的源代碼頁面,該頁面上的資訊就是通過Python能爬取到的資訊。利用滑鼠滾輪上下滾動源代碼頁面,能看到很多内容。
實戰中常将上述兩種方法聯合使用:通過F12鍵對網頁結構進行初步了解,然後在網頁上右擊并選擇“檢視網頁源代碼”指令,檢視所需内容在網頁源代碼的位置,或者通過快捷鍵Ctrl+F搜尋需要的内容。
有時通過F12鍵能看到的内容,但是通過右鍵菜單檢視網頁源代碼的方法卻觀察不到,這是因為有些網頁是動态渲染出來的。例如,新浪财經的股票資訊是動态變化的,股價内容自然不會固定地寫在網頁源代碼中,通過F12鍵看到的代碼則是經過渲染的,内容更加豐富和全面,而通過右鍵菜單獲得的内容可能就是一個網頁架構,沒有具體的資料。是以,如果通過F12鍵看到的和通過右鍵菜單看到的内容不一樣,可以參考本書8.2節中Selenium庫的相關知識點擷取F12鍵渲染過的内容。
2.1.3 網址構成及http與https協定
許多人了解的網址是“
www.baidu.com”,但其實應該是“
https://www.baidu.com”,它前面的“
https://”稱為https協定,是網址的固定構成形式,表明該網址某種程度上是安全的,有的網址前面則為“
http://”。在Python裡輸入“
”是識别不了的,必須把“
”加上才可識别,示範代碼如下:
那麼到底應該加“
”還是“
”呢?其實最簡單的判斷方法就是在浏覽器中直接通路該網址,成功打開頁面後,複制位址欄中的網址到Python代碼中即可。
2.1.4 網頁結構初步了解
網頁源代碼初看非常複雜,但了解網頁基本結構後再看網頁源代碼會輕松很多,是以下面先對網頁結構做初步了解。如下圖所示,其結構很簡單,就是一個大框套着一個中框,一個中框再套着一個小框,這樣一層層嵌套。在網頁源代碼中這種層級關系通過縮進表現得很清晰。
上圖中,如果在一行網頁源代碼前看到一個三角箭頭,就表明它是個大框,裡面還嵌套着其他框,單擊箭頭就可以展開,看到裡面嵌套的其他框。文本内容一般都在最小的框裡。
2.2 爬蟲技術基礎2—網頁結構進階
本節來進一步了解網頁結構,并試着自己搭建一個網頁,為之後學習網絡資料挖掘做準備。
對于其中的代碼了解即可,感興趣的讀者可以自己實踐一下,對之後的學習會更有幫助。
2.2.1 HTML基礎知識1—我的第一個網頁
代碼檔案:2.2.1 我的第一個網頁.html
HTML(HyperText Markup Language)是一種用于編寫網頁的标準标記語言,本小節主要介紹如何利用它來搭建網頁。下面來實際動手操作一下。打開Windows系統自帶的“記事本”,輸入如下内容:
将輸入的内容儲存為一個文本檔案(字尾名為.txt)并關閉“記事本”,将檔案字尾名由原來的.txt改為.html,此時這個文本檔案就變成了HTML檔案,即網頁檔案。輕按兩下該HTML檔案,即可在預設浏覽器中打開,顯示如右圖所示的網頁效果。
知識點
Notepad++代碼編輯器
上面用“記事本”編寫了一個本地網頁,這裡再推薦一款專業的代碼編輯器—Notepad++,其作用和PyCharm類似,都是友善我們編寫代碼的。Notepad++的下載下傳位址為:
https://notepad-plus-plus.org/。下載下傳并安裝完畢後,右擊剛才建立的HTML檔案,在彈出的快捷菜單中選擇“Edit with Notepad++”指令,便可在Notepad++中打開檔案編寫代碼。
2.2.2 HTML基礎知識2—基礎結構
本小節來完善一下之前的網頁,為學習後面的知識點做準備。用“記事本”或Notepad++打開剛才建立的HTML檔案,修改代碼如下:
然後按快捷鍵Ctrl+S儲存,在浏覽器中重新打開該HTML檔案或重新整理網頁,效果如右圖所示。
之前講過,網頁結構就是大框套着中框、中框套着小框的架構結構,如下圖所示。
前兩行的與是固定寫法,作用是将代碼聲明為HTML文檔。
2.2.3 HTML基礎知識3—标題、段落、連結
代碼檔案:2.2.3 逐漸完善的網頁.html
浏覽器中的顯示效果如下圖所示。
在前面的代碼基礎上略作修改:
<!DOCTYPE html>
<html>
<body>
<h1>這是标題 1</h1>
<p>這是标題1下的段落。</p>
<h2>這是标題 2</h2>
<p>這是标題2下的段落。</p>
</body>
</html>
在前面代碼的基礎上略作修改:
<!DOCTYPE html>
<html>
<body>
<h1>這是标題 1</h1>
<p>這是标題1下的段落。</p>
<h2>這是标題 2</h2>
<a href="https://www.baidu.com">這是帶連結的内容</a>
</body>
</html>
此時單擊連結文字就可以通路百度首頁了,該通路方式是頁面直接跳轉到百度首頁,并覆寫原網頁。如果想在一個新的标簽頁裡打開百度首頁,而不覆寫原網頁,隻要在原來的基礎上加上target=_blank即可,代碼如下:
<a href="http://www.baidu.com" target=_blank>這是百度首頁的連結</a>
2.2.4 HTML基礎知識4—區塊
2.2.5 HTML基礎知識5—類與id
1.類(class)
2.id
感興趣的讀者可以在谷歌浏覽器中打開其他網頁,然後按F12鍵打開開發者工具,觀察一下網頁源代碼。多做這種練習,能夠更好地了解網頁的結構,對之後學習網絡資料擷取及挖掘将大有幫助。
2.3 初步實戰—百度新聞源代碼擷取
百度新聞是一個非常重要的資料源,本節就先來擷取百度新聞的源代碼。如下圖所示,百度新聞目前改版為“資訊”版塊,直接在“資訊”裡便可搜尋新聞。
2.3.1 擷取網頁源代碼
代碼檔案:2.3.1 擷取百度新聞網頁源代碼.py
通過1.4.4小節介紹的Requests庫來嘗試擷取百度新聞的網頁源代碼,代碼如下:
import requests
url = 'https://www.baidu.com/s?tn=news&rtt=1&bsst=1&cl=2&wd=阿裡巴巴'
res = requests.get(url).text
print(res)
擷取到的源代碼如下圖所示。
可以看到并沒有擷取到真正的網頁源代碼,因為百度新聞網站隻認可浏覽器發送的通路請求,而不認可通過Python發送的通路請求。為了解決這個問題,需要設定requests.get()中的headers參數,以模拟浏覽器的通路請求。headers參數提供的是網站通路者的資訊,headers中的User-Agent(使用者代理)表示是用什麼浏覽器通路的,其設定方式如下所示,User-Agent的擷取方法稍後會講解。
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36'}
設定完headers之後,在通過requests.get()請求時需加上headers參數,這樣就能模拟是在通過一個浏覽器通路網站了,代碼如下:
res = requests.get(url, headers=headers).text
完整代碼如下所示:
import requests
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36'}
url = 'https://www.baidu.com/s?tn=news&rtt=1&bsst=1&cl=2&wd=阿裡巴巴'
res = requests.get(url, headers=headers).text
print(res)
運作結果如下圖所示,可以發現此時已經擷取到真正的網頁源代碼了。
這裡的headers是一個字典,它的第一個元素的鍵名為'User-Agent',值為'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36'。User-Agent實際上代表通路網站的浏覽器是哪種浏覽器。
上述代碼用的是谷歌浏覽器的User-Agent,下面就以谷歌浏覽器為例講解如何擷取浏覽器的User-Agent。打開谷歌浏覽器,在位址欄中輸入“about:version”,注意要用英文格式的冒号,按Enter鍵後在打開的界面中找到“使用者代理”項,後面的字元串就是User-Agent。
對于之後的項目實戰,隻要記得在代碼的最前面寫上如下代碼:
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36'}
然後每次用requests.get()通路網站時,加上headers=headers即可。
res = requests.get(url, headers=headers).text
有時不加headers也能獲得網頁的源代碼,如第1章通過Requests庫爬取Python官網就不需要加headers。不過headers隻需在代碼的開頭設定一次,之後直接在requests.get()中添加headers=headers即可,是以并不麻煩,而且可以避免可能會出現的爬取失敗。
通過短短幾行代碼,就能夠獲得網頁的源代碼,這是網絡資料挖掘中最重要的一步,之後所需要做的工作就是資訊提取和分析了。
2.3.2 分析網頁源代碼資訊
擷取到網頁源代碼後,還需要提取其中的新聞标題、網址、來源和日期等資訊。在提取資訊之前,可通過三種常見的分析方法來觀察這些資訊的特征,這三種方法經常結合使用。
1.利用浏覽器的F12鍵
利用2.1.1小節所講的方法,在谷歌浏覽器中打開百度新聞後按F12鍵,調出開發者工具,然後單擊“選擇”按鈕,選擇一個新聞标題,可以在“Elements”頁籤中看到該标題内容,用同樣的方法可以檢視新聞來源和日期等資訊。如果看不到其中的中文文本,單擊三角箭頭展開代碼,就可以看到了。
2.利用浏覽器的右鍵快捷菜單
利用2.1.2小節所講的方法,在打開的網頁中右擊,在彈出的快捷菜單中選擇“檢視網頁源代碼”指令,切換到源代碼頁面後,滾動滑鼠滾輪可檢視更多内容,按快捷鍵Ctrl+F可快速搜尋和定位所需内容。
3.利用Python的輸出框
在擷取到網頁源代碼的輸出框内按快捷鍵Ctrl+F,調出搜尋框,搜尋所需内容,如下圖所示。這種方法也比較常用,不過需要先通過程式獲得網頁源代碼。
在網頁源代碼裡,我們需要的資訊通常會被一些英文、空格及換行包圍着,需要通過一些手段提取出來。一個常用的手段就是使用正規表達式,将在下一節進行詳細講解。
2.4 爬蟲技術基礎3—正規表達式
正規表達式是非常好用的資訊提取工具,它可以靈活、高效地提取文本中的所需資訊。
2.4.1 正規表達式基礎1—findall()函數
代碼檔案:2.4.1 正規表達式之findall.py
首先通過一個執行個體來示範正規表達式的用法。例如,想提取字元串'Hello 123 world'中的3個數字,可以通過如下代碼實作:
import re
content = 'Hello 123 world'
result = re.findall('\d\d\d', content)
print(result)
上述代碼的第1行用于引用正規表達式re庫,re庫是Python自帶的,不用單獨安裝。
下面來講解findall()函數的使用規則。findall()函數的功能是在原始文本中尋找所有符合比對規則的文本内容,其使用格式如下所示:
re.findall(比對規則, 原始文本)
比對規則是一個由特定符号組成的字元串。上述第3行代碼的findall()函數使用的比對規則中,'d'就是一個特定符号,表示比對1個數字,那麼'ddd'就表示比對3個數字,是以re.findall('ddd', content)就是在content中尋找連續的3個數字。
程式運作結果如下,得到的是一個包含提取出的資訊的清單。
['123']
對于初學者來說要注意的一點是,findall()函數得到的是一個清單,而不是字元串或數字。下面再通過一個執行個體加深印象,這裡需要找到字元串裡所有的3位數字,代碼如下:
import re
content = 'Hello 123 world 456 華小智Python基礎教學135'
result = re.findall('\d\d\d', content)
print(result)
程式運作結果如下:
['123', '456', '135']
如果想擷取得到的清單中的某個元素,就需要使用1.2.3小節裡介紹過的list[i]方法,代碼如下:
a = result[0] # 注意清單的第1個元素的序号是0
通過print()函數将變量a列印輸出,結果如下:
123
雖然上述輸出結果看着是數字,但它是從字元串裡提取出來的,是以其實是3個字元,而不是數字,在如下清單裡也可以看出。
有的讀者可能會問,如果除了比對數字還想比對文字,應該怎麼書寫比對規則?如果原始文本包含空格或換行符,又該怎麼辦呢?實際上,像'd'這樣的特定符号還有很多,下表中列出了一些常用的特定符号及其功能。
将這些符号組合起來,就能得到千變萬化的比對規則。不過在金融資料挖掘與分析實戰中,大部分情況下需要用到的隻有兩種:(.?)與.?。接下來會分為兩個小節進行講解。
2.4.2 正規表達式基礎2—非貪婪比對之(.*?)
代碼檔案:2.4.2 正規表達式之非貪婪比對1.py
通過上一小節的學習,我們已經知道,“.”表示除了換行符外的任意字元,“”表示0個或多個表達式。将“.”和“”合在一起組成的比對規則“.*”稱為貪婪比對。之是以叫貪
婪比對,是因為會比對到過多的内容。如果再加上一個“?”構成“.*?”,就變成了非貪婪比對,它能較精确地比對到想要的内容。對于貪婪比對和非貪婪比對的概念了解即可,在實戰中通常都是用非貪婪比對。
非貪婪比對除了.?這種形式外,還有一種形式是(.?)。本小節先介紹(.?),下一小節則介紹.?。
簡單來說,(.*?)用于擷取文本A與文本B之間的内容,并不需要知道它的确切長度及格式,但是需要知道它在哪兩個内容之間,其使用格式如下所示:
文本A(.*?)文本B
下面結合findall()函數和非貪婪比對(.*?)進行文本提取的示範,代碼如下:
import re
res = '文本A百度新聞文本B'
source = re.findall('文本A(.*?)文本B', res)
print(source)
['百度新聞']
在實戰中,一般不把比對規則直接寫到findall後面的括号裡,而是拆成兩行來寫,如下所示,先寫比對規則,再寫findall()語句。原因是有時比對規則較長,分開寫會比較清晰。
p_source = '文本A(.*?)文本B'
source = re.findall(p_source, res)
在實戰中,符合'文本A(.*?)文本B'比對規則的内容通常不止一個,下面再來看一段示範代碼:
import re
res = '文本A百度新聞文本B,新聞标題文本A新浪财經文本B,文本A搜狗新聞文本B新聞網址'
p_source = '文本A(.*?)文本B'
source = re.findall(p_source, res)
print(source)
上述代碼可獲得所有符合'文本A(.*?)文本B'比對規則的内容清單,運作結果如下:
['百度新聞', '新浪财經', '搜狗新聞']
以2.3.1小節中擷取到的百度新聞網頁源代碼為例,如下圖所示,現在需要從中提取新聞來源及日期資訊。
import re
res = '<p class="c-author"><img***>央視網新聞 2019年04月13日 13:33</p>'
p_info = '<p class="c-author">(.*?)</p>'
info = re.findall(p_info, res)
print(info)
這裡為了友善示範,将所有的網頁源代碼内容都寫到一行裡,實戰中其實是有換行的,關于換行的處理将在2.4.4小節進行講解。程式運作結果如下:
['*>央視網新聞 2019年04月13日 13:33']
提取的内容中有一些我們不需要的文本,如*>圖檔标簽及 ,可以通過文本清洗去除,具體方法将在2.4.5小節及第3章進行講解。
2.4.3 正規表達式基礎3—非貪婪比對之.*?
代碼檔案:2.4.3 正規表達式之非貪婪比對2.py
(.?)用于擷取文本A與文本B之間的内容,那麼.?是用來做什麼的呢?簡單來說,.?用于代替文本C和文本D之間的所有内容。之是以要使用.?,是因為文本C和文本D之間的内容經常變動或沒有規律,無法寫到比對規則裡;或者文本C和文本D之間的内容較多,我們不想寫到比對規則裡。.*?的使用格式如下所示:
文本C.*?文本D
下面舉例介紹.*?的作用,示範代碼如下:
import re
res = '<h3>文本C<變化的網址>文本D新聞标題</h3>'
p_title = '<h3>文本C.*?文本D(.*?)</h3>'
title = re.findall(p_title, res)
print(title)
上述代碼中,文本C和文本D之間為變化的網址,用.?代表,需要提取的是文本D和之間的内容,用(.?)代表,運作結果如下:
['新聞标題']
下面利用上圖中的網頁源代碼做一個擷取新聞标題的示範。為友善示範,先不考慮換行的問題,把網頁源代碼寫到一行裡,其中data-click="{}"的大括号中的一些英文和數字内容簡化為“英文&數字”。示範代碼如下:
import re
res = '<h3 class="c-title"><a href="網址" data-click="{英文&數字}"><em>阿裡巴巴</em>代碼競賽現全球首位AI評委 能為代碼品質打分</a>'
p_title = '<h3 class="c-title">.*?>(.*?)</a>'
title = re.findall(p_title, res)
print(title)
運作結果如下:
['阿裡巴巴代碼競賽現全球首位AI評委 能為代碼品質打分']
上述示範代碼的核心是下面這行代碼,下面會講解這行代碼是如何寫出來的。
p_title = '<h3 class="c-title">.*?>(.*?)</a>'
先來分析下圖中的網頁源代碼,可以看到圖中框出的幾處是用來定位新聞标題的:
根據上圖,書寫出如下圖所示的比對規則,圖中做了标注,友善大家了解。
p_href = '<h3 class="c-title"><a href="(.*?)"'
href = re.findall(p_href, res)
以上的示範代碼都沒有考慮換行的情況,但實際的網頁源代碼裡存在很多換行,而(.?)和.?無法自動比對換行,如果遇到換行就不會繼續比對換行之後的内容了。此時就要用到下一小節的知識點:修飾符re.S。
2.4.4 正規表達式基礎4—自動考慮換行的修飾符re.S
代碼檔案:2.4.4 正規表達式之換行.py
修飾符有很多,最常用的是re.S,其作用是在使用findall()查找時,可以自動考慮到換行的影響,使得.*?可以比對換行。使用格式如下:
re.findall(比對規則, 原始文本, re.S)
示範代碼如下:
import re
res = '''文本A
百度新聞文本B'''
p_source = '文本A(.*?)文本B'
source = re.findall(p_source, res, re.S)
print(source)
由于文本A和文本B之間有換行,如果在findall後的括号中不寫re.S,則擷取不到内容,因為(.*?)比對不了換行。之前講過3個單引号'''一般用來寫注釋,而這裡是用來将帶有換行的文本框起來。運作結果如下:
下面在2.3.1小節中擷取到的百度新聞網頁源代碼中提取新聞标題和連結,代碼如下:
import re
res = '''<h3 class="c-title">
<a href="https://baijiahao.baidu.com/s?id=1631161702623128831& wfr=spider&for=pc"
data-click="{
英文&數字
}"
target="_blank"
>
<em>阿裡巴巴</em>代碼競賽現全球首位AI評委 能為代碼品質打分
</a>
'''
p_href = '<h3 class="c-title">.*?<a href="(.*?)"'
p_title = '<h3 class="c-title">.*?>(.*?)</a>'
href = re.findall(p_href, res, re.S)
title = re.findall(p_title, res, re.S)
href清單和title清單列印輸出結果如下:
['https://baijiahao.baidu.com/s?id=1631161702623128831&wfr=spider&for=pc']
['\n <em>阿裡巴巴</em>代碼競賽現全球首位AI評委 能為代碼品質打分\n ']
擷取的新聞标題包含換行符n和空格,可以利用1.4.3小節介紹的strip()函數清除,代碼如下。雖然title清單裡隻有一個元素,還是通過for循環語句來批量處理,在下一章将有應用。
for i in range(len(title)):
title[i] = title[i].strip()
清洗過的title清單如下,其中還有等無效内容,下一小節将講解如何進一步清洗文本。
2.4.5 正規表達式基礎5—知識點補充
代碼檔案:2.4.5 正規表達式之知識點補充.py
1.sub()函數
sub()函數中的sub是英文substitute(替換)的縮寫,其格式為:re.sub(需要替換的内容,替換值,原字元串)。該函數主要用于清洗正規表達式擷取到的内容,如之前擷取到的有無效内容的新聞标題:
其中的和并不是我們需要的内容,可以通過如下代碼将其替換為空值,即将其删除。注意代碼中的title是一個清單,雖然隻有1個元素,但也要用title[0]才能獲得其中的字元串,然後才可以使用sub()函數進行清洗。
title = ['阿裡巴巴代碼競賽現全球首位AI評委 能為代碼品質打分']
title[0] = re.sub('', '', title[0])
print(title[0])
上述代碼采用的替換方式類似于1.4.3小節提到的replace()函數,即依次替換特定的字元串。這種方式的缺點是,得為每個要替換的字元串寫一行替換代碼,如果要替換的字元串有很多,工作量就會比較大。此時可以觀察要替換的字元串,如果它們有類似的格式,就可以用sub()函數通過正規表達式進行批量替換。采用正規表達式進行替換的代碼如下:
import re
title = ['<em>阿裡巴巴</em>代碼競賽現全球首位AI評委 能為代碼品質打分']
title[0] = re.sub('<.*?>', '', title[0])
print(title[0])
上述兩種替換方式的代碼都可以得到如下運作結果:
阿裡巴巴代碼競賽現全球首位AI評委 能為代碼品質打分
title[0] = re.sub('<.?>', '', title[0])中的<.?>可能不太容易了解。回顧之前所講的内容,.?用于代表文本C和文本D之間的所有内容,是以<.?>就表示任何<×××>形式的内容,如右圖所示,其中自然包括和。
2.中括号[ ]的用法
中括号最主要的功能是使中括号裡的内容不再有特殊含義。在正規表達式裡,“.”“”“?”等符号都有特殊的含義,但是如果想定位的就是這些符号,就需要使用中括号。例如,想把字元串裡所有的“”号都替換成空值,示範代碼如下:
company = '*華能信托'
company1 = re.sub('[*]', '', company)
print(company1)
運作結果如下。這在爬取股票名稱時很有用,因為有時上市公司名稱裡有*号需要替換掉。
華能信托