<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    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
    下面就差算法了,抓取的準備工作終于要完成了。








    整理 m.tkk7.com/Good-Game
    posted on 2009-04-07 18:27 劉凱毅 閱讀(3662) 評論(0)  編輯  收藏 所屬分類: python
    主站蜘蛛池模板: 免费黄色app网站| 国内精品免费麻豆网站91麻豆| 亚洲AV无码一区二区一二区| 亚洲AV性色在线观看| 日韩免费a级毛片无码a∨| 国产成人aaa在线视频免费观看| 亚洲无码日韩精品第一页| 亚洲视频在线一区二区三区| 亚洲色丰满少妇高潮18p| 成人免费视频试看120秒| 久久久久久久91精品免费观看 | 亚洲日本一线产区和二线产区对比| 美女无遮挡免费视频网站| 日本黄色动图免费在线观看| 噼里啪啦电影在线观看免费高清 | 亚洲国产成人精品激情| 四虎永久在线精品免费一区二区| 免费观看在线禁片| 免费国内精品久久久久影院| 亚洲免费观看网站| 美女视频黄的免费视频网页 | 波多野结衣一区二区免费视频| 又硬又粗又长又爽免费看| 亚洲日韩av无码| 色婷婷亚洲一区二区三区| 亚洲成人免费网站| 亚洲色自偷自拍另类小说| 国产成人精品一区二区三区免费| 亚洲国产精品lv| 亚洲一级片免费看| 国产色婷婷精品免费视频| 国产精品青草视频免费播放| 亚洲精品免费观看| 日韩视频免费一区二区三区| 亚洲色偷偷偷综合网| 亚洲乱码中文字幕综合 | 亚洲一级特黄特黄的大片| 亚洲国产成人久久精品99| 亚洲色大成网站www久久九| 亚洲人午夜射精精品日韩| 日韩精品免费一级视频|