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,而十六进制数是>,这种情况下,该方法将接收到'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;>>')

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

python模块介绍- HTMLParser 简单的HTML和XHTML解析器的更多相关文章

  1. python模块介绍- multi-mechanize 性能测试工具

    python模块介绍- multi-mechanize 性能测试工具 2013-09-13 磁针石 #承接软件自动化实施与培训等gtalk:ouyangchongwu#gmail.comqq 3739 ...

  2. python模块介绍- xlwt 创建xls文件(excel)

    python模块介绍- xlwt 创建xls文件(excel) 2013-06-24磁针石 #承接软件自动化实施与培训等gtalk:ouyangchongwu#gmail.comqq 37391319 ...

  3. python模块介绍-locustio:性能测试工具locustio

    转自:http://automationtesting.sinaapp.com/blog/m_locustio_doc python测试文章 http://weibo.com/cizhenshi?is ...

  4. python模块介绍- binascii 二进制和ASCII转换

    python模块介绍-binascii二进制和ASCII转换 目录 项目简介 简介: Uu编码 Binhex编码 Base64编码 QP码 CRC校验和 二进制转换 其他实例 项目简介 Python中 ...

  5. python模块之HTMLParser(原理很大程度上就是对类构造的熟练运用)

    # -*- coding: utf-8 -*- #python 27 #xiaodeng #python模块之HTMLParser(原理很大程度上就是对类构造的熟练运用) import HTMLPar ...

  6. python模块之HTMLParser之穆雪峰的案例(理解其用法原理)

    # -*- coding: utf-8 -*- #python 27 #xiaodeng #python模块之HTMLParser之穆雪峰的案例(理解其用法原理) #http://www.cnblog ...

  7. python模块之HTMLParser抓页面上的所有URL链接

    # -*- coding: utf-8 -*- #python 27 #xiaodeng #python模块之HTMLParser抓页面上的所有URL链接 import urllib #MyParse ...

  8. python模块之HTMLParser解析出URL链接

    # -*- coding: utf-8 -*- #python 27 #xiaodeng #python模块之HTMLParser解析出URL链接 #http://www.cnblogs.com/mf ...

  9. 【python】使用HTMLParser、cookielib抓取和解析网页、从HTML文档中提取链接、图像、文本、Cookies

    一.从HTML文档中提取链接 模块HTMLParser,该模块使我们能够根据HTML文档中的标签来简洁.高效地解析HTML文档. 处理HTML文档的时候,我们常常需要从其中提取出所有的链接.使用HTM ...

随机推荐

  1. 轻量级数据sqlite的C++调用示例

    原文地址:http://www.cnblogs.com/kfqcome/archive/2011/06/27/2136999.html #include "stdafx.h" #i ...

  2. 我的Python成长之路---第四天---Python基础(14)---2016年1月23日(寒风刺骨)

    一.生成器和迭代器 1.迭代器 迭代器是访问集合元素的一种方式.迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束.迭代器只能往前不会后退,不过这也没什么,因为人们很少在迭代途中往后退. ...

  3. HDU2138 随机素数测试 Miller-Rabin算法

    题目描述 Give you a lot of positive integers, just to find out how many prime numbers there are.. In eac ...

  4. 基于visual Studio2013解决算法导论之042单源最短路径

     题目 单源最短路径 解决代码及点评 // 26单源最短路径bellmanford.cpp : 定义控制台应用程序的入口点. // #include <iostream> #incl ...

  5. 《HTML 5网页开发实例具体解释》文件夹

    第一篇  从宏观上认识HTML 5 讲述了HTML 5引发的Web革命.HTML 5的总体特性.HTML 5相关概念和框架和开发环境搭建. 第1章 HTML 5引发的Web革命 1.1  你是不是真的 ...

  6. C#数组集合使用 排序的问题

    //没有顺序 //ArrayList a = new ArrayList(); //a.Add("asda"); //a.Add("asda222222"); ...

  7. aop编程 环绕round

    <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.sp ...

  8. 数据库神器:Navicat Premium

    Navicat premium是一款数据库管理工具.将此工具连接数据库,你可以从中看到各种数据库的详细信息.包括报错,等等.当然,你也可以通过他,登陆数据库,进行各种操作.Navicat Premiu ...

  9. LVS--什么是LVS?

    1.什么是LVS? 首先简单介绍一下LVS (Linux Virtual Server)到底是什么东西,其实它是一种集群(Cluster)技术,采用IP负载均衡技术和基于内容请求分发技术.调度器具有很 ...

  10. java--方法和成员的继承,访问

    //在调用方法的时候,不是看句柄是哪一个类,而应该看对象是属于哪一个类的,属于哪一个类的,就调用哪一个类的成员和方法. //子类可以添加自己的新方法,但是子类对象的引用赋值给父类句柄之后,不能使用父类 ...