Skynet

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

            BlogJava :: 首頁(yè) :: 聯(lián)系 :: 聚合  :: 管理
            112 Posts :: 1 Stories :: 49 Comments :: 0 Trackbacks

          數(shù)據(jù):
          希望 抓取
          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>

          希望結(jié)果為
          $ 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>




          #說(shuō)明
          其實(shí) SGMLParser 我感覺(jué)最關(guān)鍵的是

          #/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 抓取會(huì)調(diào)用 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 
          = ""
                  
                  
          #業(yè)務(wù)邏輯表示變量
                  #抓取 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
                  

              
          # 重寫(xiě) 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

                      
              
          # 重寫(xiě) 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()
              
              
          # 重寫(xiě) 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 狀態(tài)修改
                  def start_div(self, attrs):
                  self.test_div
          =True

              
          # self.test_div 狀態(tài)修改
              # 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 狀態(tài)修改 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 狀態(tài)修改 1 為只能填充最后一次
                  def end_p(self):
                  
          if self.test_div_p == 2 :
                      self.test_div_p
          =1
              
                  
          # self.test_div_p_a 狀態(tài)修改
                  def start_a(self, attrs):
                  self.data_text 
          = ""
                      
          if self.test_div_p :
                          self.test_div_p_a
          =True
              
                  
          # self.test_div_p_a 狀態(tài)修改
              # 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 ,轉(zhuǎn)碼  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

              




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








          整理 www.aygfsteel.com/Good-Game
          posted on 2009-04-07 18:27 劉凱毅 閱讀(3669) 評(píng)論(0)  編輯  收藏 所屬分類: python
          主站蜘蛛池模板: 西宁市| 阿荣旗| 扬州市| 河池市| 揭东县| 卢湾区| 阜康市| 察雅县| 多伦县| 佳木斯市| 千阳县| 定兴县| 大庆市| 开化县| 蓬莱市| 鄱阳县| 博兴县| 吉水县| 惠州市| 新兴县| 荣昌县| 湛江市| 裕民县| 宜宾县| 颍上县| 综艺| 饶河县| 舞阳县| 武义县| 葫芦岛市| 政和县| 肥西县| 孟连| 宣汉县| 大余县| 望谟县| 肥城市| 青铜峡市| 通江县| 枣强县| 南澳县|