小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

Python中網(wǎng)絡(luò)頁面抓取和頁面分析

 imelee 2017-02-28

轉(zhuǎn)載本文請以鏈接形式注明出處。

1.前言

        Python的網(wǎng)絡(luò)抓取有很多包可以實現(xiàn),比如:urllib、urllib2、httplib、httplib2。其中httplib、httplib2是專門處理與http相關(guān)的;而urllib、urllib2是借助于httplib、httplib2實現(xiàn)的,相當(dāng)于在httplib、httplib2上又封裝了一層來進行處理web數(shù)據(jù)。而urllib2是urllib的高版本,httplib2是httplib的高版本。

        這里我給出一個學(xué)習(xí)python庫的網(wǎng)址,里面有各種lib庫的講解:http://docs./library/index.html  。有興趣的讀者可以看一下。

        由于最近在使用httplib2進行網(wǎng)上抓取數(shù)據(jù),所以下面對httplib2進行介紹。

2.httplib2

(1)安裝      

         httplib2的安裝:首先下載python的httplib2的安裝包,下載地址為:http://code.google.com/p/httplib2/downloads/list;其次, 在dos窗口下進入httplib2的解壓目錄,執(zhí)行命令:python setup.py install  。 即完成安裝。

(2)使用講解

        下面再給出一個httplib2的學(xué)習(xí)地址,是httplib2的一個wiki,里面有幾個httplib2的簡單例子:http://code.google.com/p/httplib2/wiki/Examples

(a)下面給出第一個httplib2的例子,根據(jù)weibo用戶的ID,抓取用戶相關(guān)信息:

         這個例子涉及到cookies的使用,下面簡單介紹一下cookies的問題:

         當(dāng)用戶抓取的網(wǎng)頁需要登陸時,一般的登錄頁面只需要用戶名和密碼,此時我們可以采用username和password的python代碼抓取網(wǎng)頁。但是當(dāng)用戶頻繁的登錄抓取時,此時登錄頁面就需要輸入用戶名、密碼和一個隨機數(shù)字圖片驗證,圖片驗證無法屏蔽掉。此時,我們這里可以采用先獲取用戶登陸后的cookies,再以http的get請求的方式向用戶發(fā)送headers(該headers包含用戶登陸后的cookies信息),這樣就避免了登陸。

        獲取cookies的方法我感覺有2種,一種是手工方式:通過fiddler軟件來查看,當(dāng)用戶在瀏覽器里輸入請求的網(wǎng)址時,通過fiddler就可以查看用戶的http的響應(yīng),具體的過程如下面2張圖片所示,第一張圖片是fiddler查看cookies的header,第二張圖是拷貝該header:

       


        第二種獲取cookies的方式,可以第一次通過用戶名和密碼向url發(fā)出請求,然后將請求后的response中的headers的cookies保存下來,下次就可以根據(jù)cookies去登錄該url并獲取頁面內(nèi)容。

        好,cookies介紹完畢,咱們回來,下面給出第一個demo(通過cookie登陸獲取微博頁面,并抓取微博用戶信息):

  1. #!/usr/bin/python  
  2. # -*-coding:utf-8 -*-  
  3. import httplib2  
  4. import urllib2  
  5. import re #正則表達式模塊  
  6.   
  7. class WeiboClass: #定義一個weibo類  
  8.   
  9.     #獲取指定url的網(wǎng)頁內(nèi)容  
  10.     def get_content(self,url,headers,id):  
  11.         http=httplib2.Http()  
  12.         response,content=http.request(url+str(id),'GET',headers=headers)  
  13.         #print url+str(id)  
  14.         return content.decode('unicode-escape').encode('utf-8')  
  15.   
  16.     #判斷weibo的用戶是否是企業(yè)用戶  
  17.     def is_company(self,url,headers,id):  
  18.         content=self.get_content(url,headers,id)  
  19.         title=r'行業(yè)'  
  20.         company_title=re.compile(title)   
  21.         if company_title.search(content): #使用正則表達式對title進行匹配          
  22.             return 1  
  23.         else:  
  24.             return 0  
  25.           
  26.     #獲取用戶的weibo信息:ID,主頁url,昵稱  
  27.     def get_info(self, url,headers,id):  
  28.         flag=self.is_company(url,headers,id)  
  29.         content=self.get_content(url,headers,id)  
  30.         if flag==0:  #如果用戶是個人用戶              
  31.             #print content  
  32.             #微博ID  
  33.             id_flag=r'\$CONFIG
    \'oid\'
     = \'([0-9].+?)\';'  
  34.             id_re=re.compile(id_flag)  
  35.             id_regx=id_re.search(content)  
  36.             id=id_regx.group(1)  
  37.             print id  
  38.   
  39.             #微博url  
  40.             url_flag=r'<meta http-equiv="mobile-agent" content="format=xhtml;" url="weibo.cn/(.+?)\?'  
  41.             url_re=re.compile(url_flag)  
  42.             url_regx=url_re.search(content)  
  43.             url_0=url_regx.group(1)  
  44.             url='http://weibo.com/'+url_0  
  45.             print url  
  46.               
  47.             #昵稱  
  48.             name_flag='<div class="name clearfix">.+?<div class="left">(.+?)<'  
  49.             name_re=re.compile(name_flag,re.S)  
  50.             name_regx=name_re.search(content)  
  51.             name=name_regx.group(1)  
  52.             name=name.decode('utf-8').encode('GBK')  
  53.             print name  
  54.   
  55. def main():              
  56.     headers={"cookie":'NSC_wjq_xfjcp.dpn_w3.6_w4=ffffffff0941137b45525d5f4f58455e445a4a423660; SUS=SID-1806453925-1342851885-XD-hgrjc-03210d75ca203f3ad0d57666a05ae49d; SUE=es%3Deabd0a14bc6e6123c5c4d058d9a2c96f%26ev%3Dv1%26es2%3Db50ae59b82b457a1ba54b2b7708fbb5b%26rs0%3DdP4RVYzORRwV64PFw6wRdNGBk0HP47V8C5SXUp%252F7Q9K2RcduYt4ECQbEDNZk%252Bs8GHDpW5wk%252B3%252FmYKP12zIyQbD1bUMd2wNBgdRX45p2rygizXgHMjH%252FFnU53HJFC2OfSvEHZADJkZD%252BTdLHidgoyy4maajVHi%252B%252B1en0zIKIf3mo%253D%26rv%3D0; SUP=cv%3D1%26bt%3D1342851885%26et%3D1342938285%26d%3Dc909%26i%3D4dc3%26us%3D1%26vf%3D0%26vt%3D0%26ac%3D0%26uid%3D1806453925%26user%3Dqipeng.sdsy%2540163.com%26ag%3D4%26name%3Dqipeng.sdsy%2540163.com%26nick%3D%25E4%25B8%2580%25E5%258C%25B9%25E5%259C%25A8%25E8%25B7%25AF%25E4%25B8%258A%25E7%259A%2584%25E9%25A9%25AC%26fmp%3D%26lcp%3D; SSOLoginState=1342851885; ads_ck=1; UOR=hao.#,weibo.com,spr_web_360_hao360_weibo_t001:1342851234578; _olympicMedalsTable=; ULV=1342851891453:53:53:53:3919105774821.296.1342851890484:1342851070843; SinaRot/u/1806453925=25; un=qipeng.sdsy@163.com; __utma=182865017.1486634646.1342787238.1342787238.1342787238.1; __utmz=182865017.1342787238.1.1.utmcsr=weibo.com|utmccn=(referral)|utmcmd=referral|utmcct=/u/1806453925; myuid=1806453925; wvr=4; ALF=1343135290; SinaRot/u/1806453925%3Fgid%3D201108260278357557=77; SinaRot/u/1806453925%3Fc%3Dspr_web_360_hao360_weibo_t001=59; _s_tentry=-; Apache=3919105774821.296.1342851890484; SINAGLOBAL=3919105774821.296.1342851890484; BAYEUX_BROWSER=4e70u68yfp1x9xreh4wbcw2jfhs; JSESSI\  
  57. ONID=3nvoas5ykh0e'}      
  58.     url='http://weibo.com/'  
  59.     print headers  
  60.     page = WeiboClass()  
  61.     page.get_info(url,headers,1842764911)  
  62.   
  63.   
  64. if __name__ == "__main__":  
  65.     main()  

(b)下面給出httplib2的第二個例子

  1. #!/usr/bin/python  
  2. # -*-coding:utf-8 -*-  
  3. import sys;  
  4. import os;  
  5. import urllib2;  
  6. import httplib2;  
  7. import Cookie;  
  8. import random;  
  9. import re;  
  10. import time;  
  11. from urllib import urlencode;  
  12. import hashlib;  
  13. import datetime;  
  14. import socket;  
  15.   
  16. #httplib2.debuglevel=1;  
  17.   
  18. def error_log(log):  
  19.     sys.stderr.write("%s\n" % (log));  
  20.   
  21. class ErrorCode:  
  22.     Succ         = 0;  
  23.     Unknown      = -1; # 未知原因  
  24.   
  25. class SimBrowser :  
  26.     socket.setdefaulttimeout(10); # 超時限制 10秒  
  27.     UserAgent="";  
  28.     cookie=None;  
  29.     httplink = httplib2.Http();      
  30.     httplink.follow_redirects = False;  
  31.     hostname="";      
  32.     def __init__(self, cookie, UserAgent="Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 2.0.50727)"):  
  33.         self.cookie = cookie;  
  34.         self.UserAgent = UserAgent;          
  35.           
  36.     def gen_cookie_str(self):  
  37.         cookiestr = '; '.join(self.cookie.output(attrs=[], header="").split('\r\n'));  
  38.         if len(cookiestr) <= 0:  
  39.             return "";  
  40.         else:  
  41.             return cookiestr;  
  42.     def prepare_request_header(self, header):  
  43.         newheader = {};  
  44.         cookiestr = self.gen_cookie_str();  
  45.         if len(cookiestr) > 0:  
  46.             newheader['Cookie'] = cookiestr;          
  47.         # set agent  
  48.         newheader['User-Agent'] = self.UserAgent;  
  49.           
  50.         # replace or append user specified values in header  
  51.         for key in header.keys():  
  52.             newheader[key] = header[key];  
  53.         return newheader;  
  54.   
  55.     # maintain cookies  
  56.     def maintain_cookie(self, response_header):  
  57.         if 'set-cookie' in response_header:  
  58.             self.cookie.load(response_header['set-cookie']);              
  59.   
  60.     def get_redirect_url(self, prevurl, res):  
  61.         if 'location' not in res:  
  62.             error_log('no location in res');  
  63.             return "";  
  64.   
  65.         location = res['location'];  
  66.         if len(location) <= 0:  
  67.             error_log('location length is zero');  
  68.             return "";  
  69.   
  70.         # check location contain fullpath of target  
  71.         if location.find("http://") != 0:  
  72.             p = re.compile(r"[(http://)]*[.\-_0-9A-Za-z]+");  
  73.             m = p.match(prevurl);  
  74.             if m != None:                  
  75.                 host = m.group();  
  76.                 return host + location;  
  77.             else:  
  78.                 error_log('cannot get host link');  
  79.                 host = "";  
  80.         else:  
  81.             return location;  
  82.   
  83.     def request(self, url, method="GET", headers={}, body="", follow_redirects=False):   
  84.         newheaders = self.prepare_request_header(headers);  
  85.         newurl = url;  
  86.         newbody = body;  
  87.         while (True):  
  88.             try:  
  89.               res, content = self.httplink.request(newurl, method=method, headers=newheaders, body=newbody);  
  90.               self.maintain_cookie(res);  
  91.             except Exception , what:  
  92.                 try:  
  93.                   res, content = self.httplink.request(newurl, method=method, headers=newheaders, body=newbody);  
  94.                   self.maintain_cookie(res);  
  95.                 except Exception , what:   
  96.                     try:  
  97.                       res, content = self.httplink.request(newurl, method=method, headers=newheaders, body=newbody);  
  98.                       self.maintain_cookie(res);  
  99.                     except Exception , what: # 訪問獲取 三次 不成功返回失敗  
  100.                         res='';  
  101.                         content='';  
  102.                         break;  
  103.   
  104.             # check redirects  
  105.             if follow_redirects==False:  
  106.                 break;  
  107.             elif res.status in(300, 301, 302):                  
  108.                 prevurl = newurl;  
  109.                 newheaders = self.prepare_request_header({});  
  110.                 newurl = self.get_redirect_url(prevurl, res);  
  111.                 body = "";  
  112.                 method="GET";  
  113.                 if len(url) > 0:  
  114.                     continue;  
  115.                 else:  
  116.                     sys.stderr.write("Error:failed to get redirect location\n");  
  117.                     break;  
  118.             else:  
  119.                 break;  
  120.         return res, content;  
  121. def main():  
  122.     cookie = Cookie.SimpleCookie();  
  123.     sim = SimBrowser(cookie);  
  124.       
  125.     aurl='http://s.weibo.com/weibo/computer&Refer=STopic_box';  
  126.     myCookie = ('UOR=,weibo.com,; myuid=1369574593; un=zhaolianxiang@126.com; \  
  127. un=zhaolianxiang@126.com; wvr=4; __utma=15428400.565128140.1342666019.13426660\  
  128. 19.1342666019.1; __utmz=15428400.1342666019.1.1.utmcsr=blog.sina.com.cn|utmccn\  
  129. =(referral)|utmcmd=referral|utmcct=/s/blog_84313fa001010n90.html; NSC_wjq_xfjc\  
  130. p.dpn_w3.6_w4=ffffffff0941010945525d5f4f58455e445a4a423660; SSOLoginState=1342\  
  131. 867370; _s_tentry=login.sina.com.cn; Apache=9964875415898.86.1342867464581; UL\  
  132. V=1342867464624:7:7:4:9964875415898.86.1342867464581:1342514299919; SUE=es%3D6\  
  133. c406ebb66f15ce0e5b852efa908d728%26ev%3Dv1%26es2%3D658950facb6ad8c9c8627639f31a\  
  134. 61de%26rs0%3Df6AWRRwcy3r7HJ7y1mdnQR5icnbFHj6Qt%252F6Og2%252FaDBwMtLGJbQhanphxu\  
  135. EWsXCI1CPdl1yhB%252BHNobWvCmQPmF0xjrJhrvxCWAoiiE7D9cPDXQVOvlQPDsAopv10Un5DDuES\  
  136. %252FZcPXtwnaCYnD5hcMAoDinTKgBxbeZ%252FBSiLzvEdQ%253D%26rv%3D0; SUP=cv%3D1%26b\  
  137. t%3D1343009147%26et%3D1343095547%26d%3Dc909%26i%3D3d45%26us%3D1%26vf%3D0%26vt%\  
  138. 3D0%26ac%3D1%26uid%3D1842764911%26user%3Dzhaolianxiang%2540126.com%26ag%3D4%26\  
  139. name%3Dzhaolianxiang%2540126.com%26nick%3DSean%26fmp%3D%26lcp%3D2011-12-25%252\  
  140. 012%253A59%253A36; SUS=SID-1842764911-1343009147-XD-cyk5d-215c6a72f1b3a340c301\  
  141. 533e2b4ce49d; ALF=1343095212; ads_ck=1; SinaRot/z/zhaolianxiang=44; SINAGLOBAL\  
  142. =9964875415898.86.1342867464581; _olympicMedalsTable=; USRHAWB=usrmdins213_206');  
  143.     headers={'Cookie':myCookie,'Content-Type':'application/x-www-form-urlencoded'};  
  144. #    print "myCookie:",myCookie;  
  145. #    body={'path':'GET/material','userid':self.BaiduId,'token':self.token,'params':'{"level":"useracct","fields":["wregion","wbudget","userstat"]}'};  
  146.     #以http的方式向aurl發(fā)出get請求,同時將http的頭headers發(fā)送過去  
  147.     #這個headers包含了用戶的登陸的cookies信息。cookies的獲取可以通過fiddler軟件來查看。  
  148.     res, content = sim.request(aurl,'GET', headers=headers);  
  149.     print "res:",res  #輸出http的響應(yīng)response  
  150.     #將獲取的網(wǎng)頁內(nèi)容先解碼,再以utf-8的形式編碼  
  151.     print "content:",content.decode('unicode-escape').encode('utf-8');  
  152.       
  153.   
  154. if __name__ == "__main__":  
  155.     main();          
  156.           

注:上面的兩個程序中的cookies均已失效,需要您通過我上面介紹的方法替換cookies中的內(nèi)容。

(3)總結(jié)

使用cookie登陸抓取指定頁面,可以像下面這樣,這是一個最簡潔的代碼

  1. #!/usr/bin/python  
  2. # coding:utf-8   
  3. import httplib2  
  4. import urllib2  
  5. import re #正則表達式模塊  
  6.   
  7. class PageClass:  
  8.   
  9.     #獲取指定url的網(wǎng)頁內(nèi)容  
  10.     def get_page(self,url,headers):  
  11.         http=httplib2.Http()  
  12.         response,content=http.request(url,'GET',headers=headers)  
  13.         #return content.decode('unicode-escape').encode('utf-8')  
  14.         return content.decode('unicode-escape').encode('utf-8')  
  15.           
  16. def main():              
  17.     headers={"cookie":'your cookie'}  
  18.     url = 'http://fengchao.baidu.com'  
  19.     #print headers  
  20.     page = PageClass()  
  21.     content = page.get_page(url,headers)  
  22.     print content  
  23.   
  24. if __name__ == "__main__":  
  25.     main()  
只需要輸入url和headers就可以抓取到指定的頁面。這里需要輸入你自己的cookie。上面的代碼執(zhí)行后的結(jié)果如下,可以看到我們抓取到了內(nèi)容:


3.XPath

        將抓取到的頁面源碼,如何進行解析,一般采用下面三種技術(shù):
        (1)lxml的xpath:基于XML的語義進行解析的(推薦)。
        (2)正則表達式(RE):基于純文本的處理。
        (3)純字符串處理(不推薦)

        總結(jié):RE對付簡單的頁面沒有問題,如果頁面結(jié)構(gòu)復(fù)雜度較高的時候,建議采用xpath,因為此時設(shè)計一個合適的RE pattern可能會遠比寫一個xpath要復(fù)雜。

        lxml的下載地址:http://pypi./pypi/lxml/2.3

       上面介紹的httplib2的2個示例均是通過RE(正則表達式)來進行頁面解析的。下面我們介紹XPath來進行頁面解析想要的內(nèi)容。

        XPATH基本上是用一種類似目錄樹的方法來描述在XML文檔中的路徑。比如用“/”來作為上下層級間的分隔。第一個“/”表示文檔的根節(jié)點(注意,不是指文檔最外層的tag節(jié)點,而是指文檔本身)。比如對于一個HTML文件來說,最外層的節(jié)點應(yīng)該是”/html”。同樣的,“..”和“.”分別被用來表示父節(jié)點和本節(jié)點。
        XPATH返回的不一定就是唯一的節(jié)點,而是符合條件的所有節(jié)點。比如在HTML文檔里使用“/html/head/scrpt”就會把head里的所有script節(jié)點都取出來。
        為了縮小定位范圍,往往還需要增加過濾條件。過濾的方法就是用“[”“]”把過濾條件加上。比如在HTML文檔里使用“/html/body/div[@id='main']”,即可取出body里id為main的div節(jié)點。其中@id表示屬性id,類似的還可以使用如@name, @value, @href, @src, @class….  。

         而函數(shù)text()的意思則是取得節(jié)點包含的文本。比如:<div>hello<p>world</p>< /div>中,用”div[text()='hello']“即可取得這個div,而world則是p的text()。

          函數(shù)position()的意思是取得節(jié)點的位置。比如“l(fā)i[position()=2]”表示取得第二個li節(jié)點,它也可以被省略為“l(fā)i[2]”。

          不過要注意的是數(shù)字定位和過濾條件的順序。比如“ul/li[5][@name='hello']”表示取ul下第五項li,并且其name必須是hello,否則返回空。而如果用“ul/li[@name='hello'][5]”的意思就不同,它表示尋找ul下第五個name為”hello“的li節(jié)點。
          此外,“*”可以代替所有的節(jié)點名,比如用”/html/body/*/span”可以取出body下第二級的所有span,而不管它上一級是div還是p或是其它什么東東。
而 “descendant::”前綴可以指代任意多層的中間節(jié)點,它也可以被省略成一個“/”。比如在整個HTML文檔中查找id為“l(fā)eftmenu”的 div,可以用“/descendant::div[@id='leftmenu']”,也可以簡單地使用“ //div[@id='leftmenu']”。
        至于“following-sibling::”前綴就如其名所說,表示同一層的下一個節(jié)點。”following-sibling::*”就是任意下一個節(jié)點,而“following-sibling::ul”就是下一個ul節(jié)點。

        下面給出一個示例,其功能為提取百度首頁搜索框上面的導(dǎo)航條的內(nèi)容:

  1. #該程序是對百度的首頁進行分析,并提取出其搜索框上面的導(dǎo)航條  
  2. import httplib2  
  3. import urllib2  
  4. import re  
  5. from lxml import etree  
  6.   
  7. def main():  
  8.     http = httplib2.Http()  
  9.     response,content = http.request("http://www.baidu.com",'GET')  
  10.     print "response:",response  
  11.     print "content:",content  
  12.   
  13.     tree = etree.HTML(content)  
  14.   
  15.     #上面的注釋為要查找的部分html  
  16.     #<p id=nv><a href=http://news.baidu.com>新聞</a><b>網(wǎng)頁</b>  
  17.     #<a href=http://tieba.baidu.com>貼吧</a><a href=http://zhidao.baidu.com>知道</a>  
  18.     #<a href=http://mp3.baidu.com>MP3</a><a href=http://image.baidu.com>圖片</a>  
  19.     #<a href=http://video.baidu.com>視頻</a><a href=http://map.baidu.com>地圖</a></p>  
  20.   
  21.     #下面開始查找id為nv的p標(biāo)簽下的所有<a>的href值  
  22.     hyperlinks = tree.xpath(u'//p[@id="nv"]/a/@href')  
  23.     print "hyperlinks:",hyperlinks  
  24.     for hyperlink in hyperlinks:  
  25.         print "hyperlink:",hyperlink  
  26.           
  27.     #查找id為nv的p標(biāo)簽下的所有<a>節(jié)點  
  28.     a_nodes = tree.xpath(u'//p[@id="nv"]/a')  
  29.     print "a_nodes_length:",len(a_nodes)  
  30.     for a_node in a_nodes:  
  31.         print "<a>:",a_node.text,a_node.attrib['href']  
  32.     print "\n"  
  33.   
  34.     #通過正則表達式查找<p id="nv">的標(biāo)簽內(nèi)容,匹配的內(nèi)容為正則表達式中的"()"內(nèi)的內(nèi)容     
  35.     name_flag='<p id="nv">(.+?)</p>'  
  36.     name_re=re.compile(name_flag,re.S)  
  37.     name_regx=name_re.search(content)  
  38.     print name_regx  
  39.     name=name_regx.group(1)  
  40.     print "name:",name  
  41.           
  42. if __name__ == "__main__":  
  43.     main()  
其執(zhí)行結(jié)果為:


下面對其進行分析:

        首先,對www.baidu.com進行http的get請求,然后將相應(yīng)的頁面結(jié)果進行分析。這里我使用了3種方式進行頁面分析,前2種方式為使用xpath提取,第3種方式為通過正則表達式匹配提取。程序中有詳細的注釋。


4.HTMLParser

        該模塊是用來解析HTML元素的??梢詮腍TML中篩選出指定的標(biāo)簽。下面給出一個例子,讀取百度首頁www.baidu.com中的所有鏈接,并打印出來。

  1. import HTMLParser  
  2. import urllib  
  3. import sys  
  4.   
  5. #定義HTML解析器  
  6. class parseLinks(HTMLParser.HTMLParser):  
  7.     #該方法用來處理開始標(biāo)簽的,eg:<div id="main">  
  8.     def handle_starttag(self, tag, attrs):  
  9.         if tag == 'a':  #如果為<a>標(biāo)簽  
  10.             #name為標(biāo)簽的屬性名,如href、name、id、onClick等等  
  11.             for name,value in attrs:      
  12.                 if name == 'href': #這時選擇href屬性  
  13.                     print "name_value: ",value  #href屬性的值  
  14.                     print "first tag:",self.get_starttag_text() #<a>標(biāo)簽的開始tag  
  15.                     print "\n"  
  16.   
  17. if __name__ == "__main__":  
  18.     #創(chuàng)建HTML解析器的實例  
  19.     lParser = parseLinks()  
  20.     #打開HTML文件  
  21.     lParser.feed(urllib.urlopen("http://www.baidu.com").read())  
  22.     lParser.close()  
        但調(diào)用feed函數(shù)時,會自動調(diào)用handle_starttag函數(shù),這里的handle_starttag函數(shù)是對原函數(shù)的重寫。handle_starttag(self,tag,attrs)中的參數(shù)tag是標(biāo)簽的名字;參數(shù)attrs是一個(name,value)鍵值對,是通過查找到tag的<>括號來確定的,其中name是tag的<>中的屬性名,value是去除引號后的值。

       上面程序的執(zhí)行結(jié)果如下:(下面的結(jié)果只是部分的屏幕截圖)


5.正則表達式(RE)

      由于上面涉及到很到正則表達式的匹配問題。下面對Python中的RE使用進行簡單的演示和說明。下面給出一段,我測試用的code:

  1. import re    
  2.     
  3. text = "JGood is a handsome booy, he is cool, clever, and so on..."    
  4. regex1 = re.match(r"\w*oo\w*", text)    
  5. if regex1:    
  6.     print "regex1:" , regex1  
  7.     print "result1:" ,regex1.group(0)    
  8. else:    
  9.     print 'not match'  
  10. print "\n"  
  11.   
  12. regex2 = re.compile(r'(\w*oo\w*)')  
  13. print "result2:" , regex2.findall(text)  
  14. print "\n"  
  15.   
  16. regex3 = re.compile(r'(\w*oo\w*).+?(\w*eve\w*).*')  
  17. regex3_result = regex3.search(text)  
  18. if regex3_result:   
  19.     print "regex3:", regex3  
  20.     print " result3:",regex3_result.group(1)," ",regex3_result.group(2)  
  21. else:  
  22.     print 'not match'  
程序的運行結(jié)果:

下面簡單的講解一下:

        regex1是通過match方法進行匹配,match只匹配字符串的開始,如果字符串開始不符合正則表達式,則匹配失敗,函數(shù)返回None;regex2是通過findall,查找所有滿足的匹配;regex3是通過search匹配整個字符串,直到找到一個匹配。

        對于regex3_result.group(1),regex3_result.group(2)是什么意思呢,我搞了半天才弄明白。group(i)表示匹配的正則表達式"()"中的內(nèi)容。如regex3_result.group(1)表示匹配的正則表達式中第一個()內(nèi)的內(nèi)容,regex3_result.group(2)表示匹配的正則表達式中第二個“()”的對應(yīng)的字符串。group(0)表示整個表達式。group是從左向右計數(shù)的,從1開始。組可以被嵌套。計數(shù)的數(shù)值可以通過從左到右計算打開的括號數(shù)來確定。

再給出一個小例子,一目了然:

  1. #!python  
  2. >>> p = re.compile('(a(b)c)d')  
  3. >>> m = p.match('abcd')  
  4. >>> m.group(0)  
  5. 'abcd'  
  6. >>> m.group(1)  
  7. 'abc'  
  8. >>> m.group(2)  
  9. 'b'  

6.如何判斷網(wǎng)絡(luò)連接

有的軟件如果需要訪問網(wǎng)絡(luò),這時我們就需要定時地檢測網(wǎng)絡(luò)的連接,下面的代碼給出了如何檢測網(wǎng)絡(luò)連接:當(dāng)連接時返回1;當(dāng)網(wǎng)絡(luò)斷掉時返回0。原理就是通過http去請求網(wǎng)頁,如果能夠請求到則網(wǎng)絡(luò)正常,如果請求出現(xiàn)異常則網(wǎng)絡(luò)斷掉。

  1. def check_network():  
  2.     import httplib2  
  3.     try:  
  4.         http = httplib2.Http()  
  5.         resp, content = http.request("http://www.baidu.com")  
  6.     except:  
  7.         return 0  
  8.     return 1 

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多