"使用正則表達式從源碼中獲取想要的內容"
html
這是python爬蟲的第二個重要內容,第一個是怎麼分析網頁源碼,包括使用各類工具分析網頁源碼python
首先仍是肯定咱們要從網頁中獲取什麼內容,但願你們尚未忘記正則表達式
"發佈人,發佈內容,點贊數,評論數"python爬蟲
爲了能更容易的上手,我這裏先跟你們說兩個經常使用的匹配公式,畢竟在不少不少的匹配中,用這兩個公式已經可以知足咱們的需求函數
1. .*? 是一個固定的搭配,.和*表明能夠匹配任意無限多個字符,加上?表示使用非貪婪模式進行匹配,也就是咱們會盡量短地作匹配,之後咱們還會大量用到 .*? 的搭配工具
2. (.*?)加了一個括號表示將匹配到的內容返回,一個(.*?)表明一個分組,就是一個返回來的值,若是在這個正則表達式中咱們匹配了4個分組,在後面的遍歷item中,item[0]就表明第一個(.*?)所指代的內容,item[1]就表明第二個(.*?)所指代的內容,以此類推spa
好了,好好記住這兩個公式表明的含義,而後咱們開始正則表達式匹配吧code
爲了簡單起見,這裏使用獲取發佈人信息做爲例子,由於貼上太多的網頁源碼很容易會亂htm
首先對例子中出現的發佈人信息感到抱歉,本無心冒犯get
--------------------帶有發佈人信息的網頁源碼--------------------------- <div class="author clearfix"> <a href="/users/29037698" target="_blank" rel="nofollow"> <img src="http://pic.qiushibaike.com/system/avtnew/2903/29037698/me dium/20150715144646.jpg" alt="炒菜X炒股"/> </a> <a href="/users/29037698" target="_blank" title="炒菜X炒股"> <h2>炒菜X炒股</h2> </a> </div> ----------------------------------end------------------------------
好,咱們能夠看到這裏的發佈人"炒菜X炒股"一共出現了三次,實際上,這三次咱們均可以做爲發佈人信息來獲取,這意味着有三個正則表達式
<div.*?class="auther.*?<img.*?alt="(.*?)"/>
這是獲取第一個發佈人信息的正則表達式
1. <div.*?class="auther.*?<img 從<div class="author開始匹配,匹配<div 到<img的內容
2. <img.*?alt=" 匹配<img 到alt=" 之間的內容
3. alt="(.*?)"/> 匹配alt=" 到 "/> 的內容,(.*?) 加了一個括號表示將匹配到的內容返回
4. .*? 最後一個表示匹配剩下的全部內容
<div.*?class="auther.*?<a.*?</a>.*?<a.*?title="(.*?)">.*?
這是獲取第二個發佈人信息的正則表達式
1. <div.*?class="auther.*?<a 從<div class="author開始匹配,匹配<div 到第一個<a的內容
2. <a.*?</a>.*?<a 爲何要有兩個 <a ,咱們再來看代碼的相應的部分
<div class="author clearfix"> ---->第一個<a----> <a href="/users/29037698" target="_blank" rel="nofollow"> <img src="http://pic.qiushibaike.com/system/avtnew/2903/29037698/medium/20150715144646.jpg" alt="炒菜不炒股"/> </a> ---->第二個<a----> <a href="/users/29037698" target="_blank" title="炒菜不炒股">
代碼中有兩個<a></a>,而咱們要的數據在第二個中,因此,咱們要使用RE將第一個表示出來,再表示第二個,否則程序不知道是哪一個<a>
<h2>(.*?)</h2>.*?
這是最簡單的也是我最喜歡的寫法,經過對整個網頁源碼的分析咱們知道,全部發布人的名字都包含在<h2></h2>這個代碼塊中,它具備很強特殊性和規律性,因此咱們能夠直接匹配這個字符
關於RE,我想說的
由於在編寫RE的過程當中,我常常遇到程序運行不報錯就是沒有結果或者是死循環的狀況,因此這裏說幾句備忘
1. RE很難寫,它的難寫之處在於它不是惟一的,你能夠有好多種寫法來實現你的功能,要寫對一個RE,推薦兩種方式
1. 傻瓜式的一級一級數據的匹配,從最開始的一層到最後面的目標層一級一級的匹配
就像上面的第二種方法
2. 認真分析源碼,找出最具表明性的地方,這能使你的RE更加簡單和有效
就像第三種方法
2. RE很繁瑣,尤爲是面對不少的數據的時候,這時候要一步一步慢慢寫,直到最終實現目標,或者是單獨抽取一部份內容出來先實現匹配,再應用到全部數據中
3. 好好體會python re模塊中函數的用法,對幾個經常使用函數的返回值,用法要熟記