python開發_HTMLParser_html文檔解析


'''HTMLParser類中,定義了很多的方法,但是很多方法都是沒有實現的,
    這需要我們繼承HTMLParser類,自己去實現一些方法
    如:

    # Overridable -- handle start tag
    def handle_starttag(self, tag, attrs):
        pass

    # Overridable -- handle end tag
    def handle_endtag(self, tag):
        pass

    # Overridable -- handle character reference
    def handle_charref(self, name):
        pass

    # Overridable -- handle entity reference
    def handle_entityref(self, name):
        pass

    # Overridable -- handle data
    def handle_data(self, data):
        pass

    # Overridable -- handle comment
    def handle_comment(self, data):
        pass

    # Overridable -- handle declaration
    def handle_decl(self, decl):
        pass

    # Overridable -- handle processing instruction
    def handle_pi(self, data):
        pass

'''

下面是我做的demo

運行效果

Python 3.3.2 (v3.3.2:d047928ae3f6, May 16 2013, 00:03:43) [MSC v.1600 32 bit (Intel)] on win32
Type "copyright", "credits" or "license()" for more information.
>>> ================================ RESTART ================================
>>> 
開始讀取文件:[c:\test\hongten.html]
源html:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
 <head>
  <title> Python Html module </title>
  <meta name="Generator" content="EditPlus">
  <meta name="Author" content="Hongten">
  <meta name="Keywords" content="hongten,python">
  <meta name="Description" content="this blogs is about python">
 </head>
 <!-- this is  comment-->
 <body>
    <table border = "1">
        <tr>
            <td>
            Author
            </td>
            <td>
            Hongten
            </td>
            <td>
            Mail
            </td>
            <td>
            hongtenzone@foxmail.com
            </td>
        </tr>
        <tr>
            <td>
            Blog
            </td>
            <td>
            <a href="http://www.blogs.com/hongten">http://www.blogs.com/hongten</a>
            </td>
            <td>
            QQ
            </td>
            <td>
            648719819
            </td>
        </tr>
    </table>
 </body>
</html>

##################################################
遇到聲明:DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd" 開始處理:DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"
遇到數據:
 開始處理:

遇到起始標簽:html 開始處理:html
遇到數據:
  開始處理:
 
遇到起始標簽:head 開始處理:head
遇到數據:
   開始處理:
  
遇到起始標簽:title 開始處理:title
遇到數據: Python Html module  開始處理: Python Html module 
遇到結束標簽:title 開始處理:title
遇到數據:
   開始處理:
  
遇到起始標簽:meta 開始處理:meta
遇到數據:
   開始處理:
  
遇到起始標簽:meta 開始處理:meta
遇到數據:
   開始處理:
  
遇到起始標簽:meta 開始處理:meta
遇到數據:
   開始處理:
  
遇到起始標簽:meta 開始處理:meta
遇到數據:
  開始處理:
 
遇到結束標簽:head 開始處理:head
遇到數據:
  開始處理:
 
遇到注釋: this is  comment 開始處理: this is  comment
遇到數據:
  開始處理:
 
遇到起始標簽:body 開始處理:body
遇到數據:
     開始處理:
    
遇到起始標簽:table 開始處理:table
遇到數據:
         開始處理:
        
遇到起始標簽:tr 開始處理:tr
遇到數據:
             開始處理:
            
遇到起始標簽:td 開始處理:td
遇到數據:
            Author
             開始處理:
            Author
            
遇到結束標簽:td 開始處理:td
遇到數據:
             開始處理:
            
遇到起始標簽:td 開始處理:td
遇到數據:
            Hongten
             開始處理:
            Hongten
            
遇到結束標簽:td 開始處理:td
遇到數據:
             開始處理:
            
遇到起始標簽:td 開始處理:td
遇到數據:
            Mail
             開始處理:
            Mail
            
遇到結束標簽:td 開始處理:td
遇到數據:
             開始處理:
            
遇到起始標簽:td 開始處理:td
遇到數據:
            hongtenzone@foxmail.com
             開始處理:
            hongtenzone@foxmail.com
            
遇到結束標簽:td 開始處理:td
遇到數據:
         開始處理:
        
遇到結束標簽:tr 開始處理:tr
遇到數據:
         開始處理:
        
遇到起始標簽:tr 開始處理:tr
遇到數據:
             開始處理:
            
遇到起始標簽:td 開始處理:td
遇到數據:
            Blog
             開始處理:
            Blog
            
遇到結束標簽:td 開始處理:td
遇到數據:
             開始處理:
            
遇到起始標簽:td 開始處理:td
遇到數據:
             開始處理:
            
遇到起始標簽:a 開始處理:a
遇到數據:http://www.blogs.com/hongten 開始處理:http://www.blogs.com/hongten
遇到結束標簽:a 開始處理:a
遇到數據:
             開始處理:
            
遇到結束標簽:td 開始處理:td
遇到數據:
             開始處理:
            
遇到起始標簽:td 開始處理:td
遇到數據:
            QQ
             開始處理:
            QQ
            
遇到結束標簽:td 開始處理:td
遇到數據:
             開始處理:
            
遇到起始標簽:td 開始處理:td
遇到數據:
            648719819
             開始處理:
            648719819
            
遇到結束標簽:td 開始處理:td
遇到數據:
         開始處理:
        
遇到結束標簽:tr 開始處理:tr
遇到數據:
     開始處理:
    
遇到結束標簽:table 開始處理:table
遇到數據:
  開始處理:
 
遇到結束標簽:body 開始處理:body
遇到數據:
 開始處理:

遇到結束標簽:html 開始處理:html
遇到數據:
 開始處理:

>>> 

HTMLParser會對html文檔進行解析處理

=============================================

代碼部分:

=============================================

  1 #python html.parser
  2 
  3 #Author  : Hongten
  4 #Mailto  : hongtenzone@foxmail.com
  5 #Blog    : http://www.cnblogs.com/hongten
  6 #QQ      : 648719819
  7 #Create  : 2013-08-26
  8 #Version : 1.0
  9 
 10 import os
 11 from html.parser import HTMLParser
 12 
 13 '''
 14     在HTMLParser類中,定義了很多的方法,但是很多方法都是沒有實現的,
 15     這需要我們繼承HTMLParser類,自己去實現一些方法
 16     如:
 17 
 18     # Overridable -- handle start tag
 19     def handle_starttag(self, tag, attrs):
 20         pass
 21 
 22     # Overridable -- handle end tag
 23     def handle_endtag(self, tag):
 24         pass
 25 
 26     # Overridable -- handle character reference
 27     def handle_charref(self, name):
 28         pass
 29 
 30     # Overridable -- handle entity reference
 31     def handle_entityref(self, name):
 32         pass
 33 
 34     # Overridable -- handle data
 35     def handle_data(self, data):
 36         pass
 37 
 38     # Overridable -- handle comment
 39     def handle_comment(self, data):
 40         pass
 41 
 42     # Overridable -- handle declaration
 43     def handle_decl(self, decl):
 44         pass
 45 
 46     # Overridable -- handle processing instruction
 47     def handle_pi(self, data):
 48         pass
 49 
 50 '''
 51 
 52 #global var
 53 HTML_FILE = ''
 54 HTML_STR = ''
 55 
 56 class MyHTMLParser(HTMLParser):
 57     '''
 58     MyHTMLParser類繼承HTMLParser類,
 59     然后去實現HTMLParser的一些方法
 60     '''
 61     def handle_starttag(self, tag, attrs):
 62         print("遇到起始標簽:{} 開始處理:{}".format(tag, tag))
 63     def handle_endtag(self, tag):
 64         print("遇到結束標簽:{} 開始處理:{}".format(tag, tag))
 65     def handle_data(self, data):
 66         print("遇到數據:{} 開始處理:{}".format(data, data))
 67     def handle_comment(self, data):
 68         print('遇到注釋:{} 開始處理:{}'.format(data, data))
 69     def handle_decl(self, decl):
 70         print('遇到聲明:{} 開始處理:{}'.format(decl, decl))
 71 
 72 
 73 def parser_test(html_str):
 74     '''解析html源文件'''
 75     parser = MyHTMLParser(strict =  False)
 76     parser.feed(html_str)
 77     parser.close()
 78 
 79 
 80 def read_html_file(path):
 81     '''讀取html文件源文件信息'''
 82     content = ''
 83     if os.path.exists(path):
 84         print('開始讀取文件:[{}]'.format(path))
 85         with open(path, 'r') as pf:
 86             for line in pf:
 87                 content += line
 88             pf.close()
 89             return content
 90     else:
 91         print('the path [{}] dosen\'t exist!'.format(path))
 92         return content
 93 
 94 def init():
 95     #html源文件位置
 96     global HTML_FILE
 97     HTML_FILE = 'c:\\test\\hongten.html'
 98     #html源文件的內容
 99     global HTML_STR
100     HTML_STR = read_html_file(HTML_FILE)
101 
102 def main():
103     init()
104     print('源html:\n{}'.format(HTML_STR))
105     print('#' * 50)
106     parser_test(HTML_STR)
107 
108 if __name__ == '__main__':
109     main()

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM