zoukankan      html  css  js  c++  java
  • Python 3 解析 html

    资料:https://docs.python.org/3/library/html.parser.html

    python 自带了一个类,叫 HTMLParser。

    我们用的时候需要自己定义一个类,继承自 HTMLParser 。然后重写一部分方法。

    下面是我们常用的解析html的方法,可以看到在 HTMLParser 里面,这些方法内容都是空的,也就是如果我们要用某个方法,我们得自己再我们的类里面重写这个方法。具体的每个方法的使用方式参见下文。

    # Overridable -- finish processing of start+end tag: <tag.../>
        def handle_startendtag(self, tag, attrs):
            self.handle_starttag(tag, attrs)
            self.handle_endtag(tag)
    
        # 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

    使用

    1. 简单解析

    from html.parser import HTMLParser
    
    class MyHTMLParser(HTMLParser):
        def handle_starttag(self, tag, attrs):
            print("Encountered a start tag:", tag)
    
        def handle_endtag(self, tag):
            print("Encountered an end tag :", tag)
    
        def handle_data(self, data):
            print("Encountered some data  :", data)
    
    parser = MyHTMLParser()
    parser.feed('<html><head><title>Test</title></head><body><h1>Parse me!</h1></body></html>')

    这里写了一个类 MyHTMLParse ,继承自 HTMLParser。然后重写了 handle_xxx方法。

    然后只要调用该类的 feed() 方法,将html格式的数据传进去,遇到特定的数据,就会自动触发相应的方法。比如遇到<html>就会触发handle_starttag()方法进行处理。

    执行结果如下:

    Encountered a start tag: html
    Encountered a start tag: head
    Encountered a start tag: title
    Encountered some data  : Test
    Encountered an end tag : title
    Encountered an end tag : head
    Encountered a start tag: body
    Encountered a start tag: h1
    Encountered some data  : Parse me!
    Encountered an end tag : h1
    Encountered an end tag : body
    Encountered an end tag : html

    2. 复杂解析

    from html.parser import HTMLParser
    from html.entities import name2codepoint
    
    class MyHTMLParser(HTMLParser):
        def handle_starttag(self, tag, attrs):
            print("Start tag:", tag)
            for attr in attrs:
                print("     attr:", attr)
    
        def handle_endtag(self, tag):
            print("End tag  :", tag)
    
        def handle_data(self, data):
            print("Data     :", data)
    
        def handle_comment(self, data):
            print("Comment  :", data)
    
        def handle_entityref(self, name):
            c = chr(name2codepoint[name])
            print("Named ent:", c)
    
        def handle_charref(self, name):
            if name.startswith('x'):
                c = chr(int(name[1:], 16))
            else:
                c = chr(int(name))
            print("Num ent  :", c)
    
        def handle_decl(self, data):
            print("Decl     :", data)
    
    parser = MyHTMLParser()

    1)解析文档类型申明

    传入html数据如下:

    parser.feed('<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">')

    执行结果如下,可以看到会自动调用 handle_decl() 方法。

    Decl     : DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"

    2) 解析属性

    传入html数据如下:

    parser.feed('<img src="python-logo.png" alt="The Python logo">')

    执行结果如下,可以看到会自动调用 handle_starttag()方法。

    Start tag: img
         attr: ('src', 'python-logo.png')
         attr: ('alt', 'The Python logo')

    3)解析数据以及结束标签

    传入html数据如下:

    parser.feed('<style type="text/css">#python { color: green }</style>')

    执行结果如下,可以看到会自动调用 handle_data() 以及 handle_endtag()方法。

    Start tag: style
         attr: ('type', 'text/css')
    Data     : #python { color: green }
    End tag  : style

    4)解析备注

    传入html数据如下:

    parser.feed('<!-- a comment --><!--[if IE 9]>IE-specific content<![endif]-->')

    执行结果如下,可以看到会自动调用 handle_comment()方法。

    Comment  :  a comment 
    Comment  : [if IE 9]>IE-specific content<![endif]

    5)解析实体字符

    传入html数据如下:

    parser.feed('&gt;&#62;&#x3E;')

    在html语言中 ‘>’这个符号,实体名称为 &gt , 实体编号为 &#62。这里 &#x3E表示16进制数字,3E转化过来和62 是一致的。

    执行结果如下,可以看到会自动调用 handle_entityref() 来处理 &gt ,然后调用 handle_charref()来处理 &#62 以及 &#x3E。

    Named ent: >
    Num ent  : >
    Num ent  : >
  • 相关阅读:
    Android 开发之 HelloWorld
    Spring 声明式事务管理
    对于初步搭建好的SSH框架进行简化(注解的使用)
    在已有的 eclipse 中离线配置 android 开发环境
    SSH框架整合总结
    Android的学习第六章(布局一TableLayout)
    Android的学习第六章(布局二--RelativeLayout)
    Android的学习第六章(布局一LinearLayout)
    我的Android第五章
    我的Android第四章
  • 原文地址:https://www.cnblogs.com/miniren/p/7272755.html
Copyright © 2011-2022 走看看