Skynet

          ---------- ---------- 我的新 blog : liukaiyi.cublog.cn ---------- ----------

            BlogJava :: 首頁 :: 聯系 :: 聚合  :: 管理
            112 Posts :: 1 Stories :: 49 Comments :: 0 Trackbacks

          數據:
          希望 抓取
          div > p id='da' > a text
          和 div > p id='da' > html

          <div> 
             
          <id="tt">
               
          <href=/tag/php>no no</a> 
            
          </p>
            
          <id='da'>
              
          <href=/tag/php>php</a> 
              
          <href=/tag/python>python</a> 
              
          <href=/tag/vim>vim</a> 
              
          <href=/tag/windows>windows</a> 
             
          <href=/tag/wingide>wingide</a> 
            
          </p> 
          </div> 
          <id='da'>
             
          <href=/tag/wingide>hehe</a> 
          </p>

          希望結果為
          $ python t.py
          a_text: ["'php'", "'python'", "'vim'", "'windows'", "'wingide'"]

           div_html[0]:
           
          <id="da">
              
          <href="/tag/php">php</a>
              
          <href="/tag/python">python</a>
              
          <href="/tag/vim">vim</a>
              
          <href="/tag/windows">windows</a>
             <href="/tag/wingide">劉凱毅</a>
            
          </p>




          #說明
          其實 SGMLParser 我感覺最關鍵的是

          #/usr/lib/python2.5/sgmllib.py
          #
           Internal -- finish parsing of <tag/data/ (same as <tag>data</tag>)
              def finish_shorttag(self, tag, data):
                  
          #而 finish_starttag finish_endtag 抓取會調用 end_* start_* 什么的 
                  self.finish_starttag(tag, []) 
                  self.handle_data(data)
                  self.finish_endtag(tag)
             





          代碼:
          #!python
          #
          coding=UTF-8

          from sgmllib import SGMLParser
          class TestSGMLParser(SGMLParser):

              
          def reset(self, verbose=0):
                  SGMLParser.reset(self)
                  
                  
          #提取 a text ; div html 
                  self.a_text=[]
                  self.div_html
          =[]

                  
          #寄存變量
                  self.data_text = ""
                  self.data_html 
          = ""
                  
                  
          #業務邏輯表示變量
                  #抓取 div > p id="da" > a
                  #由于需要得到div p 的 html > test_div_p = 0 , 1 , 2
                  self.test_div=False
                  self.test_div_p
          =0
                  self.test_div_p_a
          =False
                  

              
          # 重寫 handle_data 
              # 寄存變量 填充值
              def handle_data(self, data):
                      self.data_text 
          = self.data_text + data
                  
          if self.test_div_p :
                      self.data_html 
          = self.data_html +data

                      
              
          # 重寫 finish_starttag 
              # self.data_html 填充值
              def finish_starttag(self, tag, attrs):
                  SGMLParser.finish_starttag(self, tag, attrs)
                  
          if self.test_div_p :
                          strattrs 
          = "".join([' %s="%s"' % (key, value) for key, value in attrs])
                          self.data_html
          =self.data_html+"<%(tag)s%(strattrs)s>" % locals()
              
              
          # 重寫 finish_endtag 
              # self.data_html 填充值
                  def finish_endtag(self, tag):         
                  SGMLParser.finish_endtag(self, tag)
                  
          if self.test_div_p == 2 :
                      self.data_html
          =self.data_html+"</%(tag)s>" % locals()
                  
          elif self.test_div_p == 1 :
                      self.data_html
          =self.data_html+"</%(tag)s>" % locals()
                      self.test_div_p 
          = 0


              
          # self.test_div 狀態修改
                  def start_div(self, attrs):
                  self.test_div
          =True

              
          # self.test_div 狀態修改
              # self.div_html 填充
                  def end_div(self):
                  
          if self.test_div :    
                      self.div_html.append(self.data_html)
                  self.test_div
          =False

              
          # self.test_div_p 狀態修改 2 為可以填充
                  def start_p(self, attrs):
                      
          if self.test_div and attrs and 'id' in [ key for key, value in attrs ] and  len([ value for key, value in attrs if key=='id' and value=='da'])>0 :
                      self.test_div_p
          =2

              
          # self.test_div_p 狀態修改 1 為只能填充最后一次
                  def end_p(self):
                  
          if self.test_div_p == 2 :
                      self.test_div_p
          =1
              
                  
          # self.test_div_p_a 狀態修改
                  def start_a(self, attrs):
                  self.data_text 
          = ""
                      
          if self.test_div_p :
                          self.test_div_p_a
          =True
              
                  
          # self.test_div_p_a 狀態修改
              # self.a_text 填充
                  def end_a(self):
                      
          if self.test_div_p and self.test_div and self.test_div_p_a  :
                              self.a_text.append(repr(self.data_text))
                      self.test_div_p_a
          =False

                  
          def close(self):
                      SGMLParser.close(self)


          if __name__ == '__main__':
              
          try:
                  f 
          = open('google.html''r')
                  data 
          = f.read()
                  x
          =TestSGMLParser()
                  x.feed(data)
                  x.close()
                  
          # 我這 gvim utf8 ; cygwin gbk ,轉碼  unicode( str , 'utf8').encode('gbk')
                  print "a_text: %s \n div_html[0]: \n %s"%(x.a_text[:-1],  unicode(x.div_html[0], 'utf8').encode('gbk') )

             
          except IOError, msg:
                  
          print file, ":", msg

              




          頁面抓取
             抓取 pycurl + 分析用  SGMLParser + 驗證碼用 pytesser
          下面就差算法了,抓取的準備工作終于要完成了。








          整理 www.aygfsteel.com/Good-Game
          posted on 2009-04-07 18:27 劉凱毅 閱讀(3662) 評論(0)  編輯  收藏 所屬分類: python
          主站蜘蛛池模板: 成安县| 孟村| 博野县| 呼伦贝尔市| 巴青县| 全椒县| 湾仔区| 邯郸市| 涿鹿县| 登封市| 广丰县| 平邑县| 嵊泗县| 五大连池市| 岳阳县| 杭州市| 乌鲁木齐县| 六枝特区| 永泰县| 岐山县| 社旗县| 静宁县| 株洲县| 平顺县| 固原市| 天津市| 淮滨县| 蒲江县| 秦皇岛市| 沾化县| 滨州市| 桂东县| 治县。| 乐山市| 丰都县| 宿松县| 洮南市| 马边| 富蕴县| 松潘县| 莱阳市|