python-19:使用正則表達式從源碼中獲取想要的內容

"使用正則表達式從源碼中獲取想要的內容"
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模塊中函數的用法,對幾個經常使用函數的返回值,用法要熟記

相關文章
相關標籤/搜索