zoukankan      html  css  js  c++  java
  • python模块介绍- HTMLParser 简单的HTML和XHTML解析器

    python模块介绍- HTMLParser 简单的HTML和XHTML解析器

    2013-09-11 磁针石

    #承接软件自动化实施与培训等gtalk:ouyangchongwu#gmail.comqq 37391319

    #博客:http://blog.csdn.net/oychw

    #版权所有,转载刊登请来函联系

    # 深圳测试自动化python项目接单群113938272深圳广州软件测试开发 6089740

    #深圳湖南人业务户外群 66250781武冈洞口城步新宁乡情群49494279

    #参考资料:python手册

    注意
    HTMLParser的模块已经在Python 3中更名为html.parser。 2to3工具会自动转换import语句到Python3。
    python2.2新增该模块。
    源代码:lib/ HTMLParser.py

    简介

    该模块定义了一个HTMLParse类作为解析格式化的文本文件HTML(超文本标记语言)和XHTML的基础。不像htmllib的解析器,这个解析器不基于sgmllib模块的SGML解析器。

    class HTMLParser.HTMLParser
                   HTMLParser的实例接受html数据,在碰到开始tag,结束tag,文本,注释和其他标记元素时调用对应的处理方法。用户需要继承的HTMLParser并重载一些方法来实现期望的行为。

                   HTMLParser类无任何参数。

                   不像htmllib的解析器,解析器不检查结束标签是否匹配开始标签,或为隐式关闭标签调用结束标签处理器。

    另htmllib和sgmllib在python3已经被取消,不建议使用。

    异常:

    exception HTMLParser.HTMLParseError

    HTMLParser的是能够处理零碎的标签,但在某些情况下,它也可能会遇到错误而引发异常。此异常提供了三个属性:msg是一个简短描述错误的消息,lineno行号,offset列偏移。

    简单实例:

    fromHTMLParser import HTMLParser

    fromhtmlentitydefs import name2codepoint

    classMyHTMLParser(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 = unichr(name2codepoint[name])

            print "Named ent:", c

        def handle_charref(self, name):

            if name.startswith('x'):

                c = unichr(int(name[1:], 16))

            else:

                c = unichr(int(name))

            print "Num ent  :", c

        def handle_decl(self, data):

            print "Decl     :", data

    parser= MyHTMLParser()

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

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

    执行结果:

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

    None

    Starttag: img

         attr: ('src', 'python-logo.png')

         attr: ('alt', 'The Python logo')

    None

    HTMLParser的方法:

    HTMLParser.feed(data)

                提交文本给解析器。不完整的会缓冲直到更多的数据被送入或close()被调用。数据可以是Unicode(推荐)或str。

    HTMLParser.close()

                强制处理所有缓冲数据,好像比一个文件结束标志。派生类可以重新定义,在输入结束,而是重新定义的版本应该总是调用HTMLParser的基类方法close()。

    HTMLParser.reset()

                重置实例。所有未处理数据会丢失。

    HTMLParser.getpos()

                返回当前的行号和偏移量。

    HTMLParser.get_starttag_text()

                返回最近标记的文本。一般用不上,偶尔用于比较文本。

    下面的方法在遇到数据或者标签时会调用,除了handle_startendtag外,父类通常什么都不做,需要子类重载。

    HTMLParser.handle_starttag(tag, attrs)

    来处理一个标签(如<divid="main"> )开始。
    标签的名称会转换为小写。的attrs参数是一个列表,包含TAG中的(name, value)对。Name转为小写。比如会转为handle_starttag('a', [('href','http://www.cwi.nl/')])。

    2.6版本中更改: htmlentitydefs的实体引用全部改成了属性值。

    HTMLParser.handle_endtag(tag)

    HTMLParser.handle_endtag (标签)

    处理结束标签,同样会转为小写。

    HTMLParser.handle_startendtag(tag, attrs)

    和handle_starttag()相似,在遇到XHTML风格的空标签比如(<img />)使用。默认实现只是调用handle_starttag()和handle_endtag()。

    HTMLParser.handle_data(data)

                处理任意数据(如文本节点和内容的<SCRIPT>的... < / SCRIPT >和<style>...</style>).。

    HTMLParser.handle_entityref(name)

                处理指定的字符引用的形式&name; (e.g. &gt;),名称是通用实体引用(e.g. 'gt')。

    HTMLParser.handle_charref(name)

                处理十进制和十六进制数字字符引用的形式&#NNN; 和 &#xNNN。例如,&gt的十进制的表示是&#62,而十六进制数是&#x3E;,这种情况下,该方法将接收到'62'或' X3E ' 。

    HTMLParser.handle_comment(data)

    处理注释(e.g. <!--comment-->)。
    例如,注释<! - 评论 - >将导致此方法被称为“评论”的说法。

    Internet Explorer条件的注释 (condcoms)的内容也将被发送到这个方法,所以<!--[if IE 9]>IE9-specificcontent<![endif,这种方法会收到'[if IE 9]>IE-specificcontent<![endif]' 。

    HTMLParser.handle_decl(decl)

    处理HTML DOCTYPE声明(例如,(e.g. <!DOCTYPE html>).

    HTMLParser.handle_pi(data)

                处理指令时遇到的。数据参数将包含整个的处理指令。例如,对于处理指令<?proc color='red'>,则此方法将被调用为handle_pi("proccolor='red'")。

          注意: HTMLParser类使用SGML的语法规则的处理指令。一个XHTML处理指令拖尾的?也包括在数据中。

    The HTMLParser class uses theSGML syntactic rules for processing instructions. An XHTML processinginstruction using the trailing '?' will cause the'?' to be includedin data.

    HTMLParser.unknown_decl(data)

    处理不认识的确认声明。

    更多实例:

    fromHTMLParser import HTMLParser

    fromhtmlentitydefs import name2codepoint

    classMyHTMLParser(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 = unichr(name2codepoint[name])

            print "Named ent:", c

        def handle_charref(self, name):

            if name.startswith('x'):

                c = unichr(int(name[1:], 16))

            else:

                c = unichr(int(name))

            print "Num ent  :", c

        def handle_decl(self, data):

            print "Decl     :", data

    parser= MyHTMLParser()

    print"DOCTYPE:"

    parser.feed('<!DOCTYPEHTML PUBLIC "-//W3C//DTD HTML 4.01//EN"'

       '"http://www.w3.org/TR/html4/strict.dtd">')

    print"img:"

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

    print"h1:"

    parser.feed('<h1>Python</h1>')

    print"style:"

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

    print"script:"

    parser.feed('<scripttype="text/javascript">')

    parser.reset()

    print"comments"

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

    print"numeric:"

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

    print"Feeding incomplete chunks"

    forchunk in ['<sp', 'an>buff', 'ered ', 'text</s', 'pan>']:

        parser.feed(chunk)

       

    print" invalid HTML :"

    parser.feed('<p><aclass=link href=#main>tag soup</p ></a>')

    执行结果:

    DOCTYPE:

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

    img:

    Starttag: img

         attr: ('src', 'python-logo.png')

         attr: ('alt', 'The Python logo')

    h1:

    Starttag: h1

    Data     : Python

    Endtag  : h1

    style:

    Starttag: style

         attr: ('type', 'text/css')

    Data     : #python { color: green }

    Endtag  : style

    script:

    Starttag: script

         attr: ('type', 'text/javascript')

    comments

    Comment  :  acomment

    Comment  : [if IE 9]>IE-specificcontent<![endif]

    numeric:

    Namedent: >

    Nument  : >

    Nument  : >

    Feedingincomplete chunks

    Starttag: span

    Data     : buff

    Data     : ered

    Data     : text

    Endtag  : span

     invalid HTML :

    Starttag: p

    Starttag: a

         attr: ('class', 'link')

         attr: ('href', '#main')

    Data     : tag soup

    Endtag  : p

    Endtag  : a

     

    参考资料:

    http://docs.python.org/2/library/htmlparser.html

     

     

  • 相关阅读:
    13,发布CRM
    12,nginx+uWSGI+django+virtualenv+supervisor发布web服务器
    11.2,nginx负载均衡实验
    11.1,nginx集群概念
    11,nginx入门与实战
    10,python开发之virtualenv与virtualenvwrapper
    9.5web service基础知识
    9.4python开发之virtualenv与virtualenvwrapper
    9.3centos7安装python3 以及tab补全功能
    Google 浏览器被劫持怎么办?
  • 原文地址:https://www.cnblogs.com/keanuyaoo/p/3315345.html
Copyright © 2011-2022 走看看