非常教程

Python参考手册

结构化标记 | Structured Markup

HTMLParser

注意

HTMLParser模块已被重命名为html.parserPython 3. 当将源代码转换为Python 3时,2to3工具将自动适应导入。

2.2版本中的新功能。

源代码: Lib / HTMLParser.py

该模块定义了一个类HTMLParser,它用作解析HTML(超文本标记语言)和XHTML格式的文本文件的基础。 与htmllib中的解析器不同,此解析器不基于sgmllib中的SGML解析器。

class HTMLParser.HTMLParser

HTMLParser实例提供HTML数据,并在遇到开始标记,结束标记,文本,注释和其他标记元素时调用处理程序方法。 用户应该子类HTMLParser并覆盖其方法来实现所需的行为。

HTMLParser类实例化没有参数。

与htmllib中的解析器不同,此解析器不会检查结束标记是否匹配开始标记,也不会检查通过关闭外部元素隐式关闭的元素的结束标记处理程序。

也定义了一个例外:

exception HTMLParser.HTMLParseError

HTMLParser能够处理破损的标记,但在某些情况下,它可能会在解析时遇到错误时引发此异常。 这个异常提供了三个属性:msg是解释错误的简短消息,lineno是检测到破坏构造的行的编号,offset是构造开始的行中的字符数。

1.示例HTML解析器应用程序

作为一个基本的例子,下面是一个简单的HTML解析器,它使用这个HTMLParser类来打印出它们遇到的开始标签,结束标签和数据:

from HTMLParser import HTMLParser

# create a subclass and override the handler methods
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

# instantiate the parser and fed it some HTML
parser = MyHTMLParser()
parser.feed('<html><head><title>Test</title></head>'
            '<body><h1>Parse me!</h1></body></html>')

输出将是:

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.HTMLParser方法

HTMLParser 实例具有以下方法:

HTMLParser.feed(data)

将一些文本提供给解析器。 它是由完整的元素组成的, 不完整的数据被缓冲,直到更多的数据被馈送或调用close()。 数据可以是unicode或str,但建议传递unicode。

HTMLParser.close()

强制处理所有缓冲数据,就好像它后面跟着一个文件结束标记。 这个方法可以由派生类重新定义,以在输入结束时定义额外的处理,但重定义的版本应该总是调用HTMLParser基类方法close()。

HTMLParser.reset()

重置实例。丢失所有未处理的数据。这在实例化时被隐含地调用。

HTMLParser.getpos()

返回当前行号和偏移量。

HTMLParser.get_starttag_text()

返回最近打开的开始标签的文本。这通常不是结构化处理所需要的,但对于处理HTML“部署”或重新生成输入时只需要很少的修改(可以保留属性之间的空白等)可能很有用。

当遇到数据或标记元素时,将调用以下方法,并且这些方法旨在在子类中重写。 基类实现什么也不做(除了handle_startendtag()):

HTMLParser.handle_starttag(tag, attrs)

调用此方法来处理标记(例如<div id="main">)的开始。

标记参数是转换为小写的标记的名称。 attrs参数是包含标签<>括号内的属性的(名称,值)对列表。 该名称将被转换为小写,并且该值中的引号已被删除,并且字符和实体引用已被替换。

例如,对于标签<A HREF="https://www.cwi.nl/">,这个方法将被称为handle_starttag('a', [('href', 'https://www.cwi.nl/')])

在版本2.6中更改:现在,来自htmlentitydefs的所有实体引用都将在属性值中进行替换

HTMLParser.handle_endtag(tag)

调用此方法来处理元素的结束标记(例如</div>)。

tag 参数被转换为较低的情况下,标记的名称。

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的形式的命名字符引用; (例如&gt;),其中name是通用实体引用(例如'gt')。

HTMLParser.handle_charref(name)

调用此方法来处理&#NNN;表单的十进制和十六进制数字字符引用。 和&#xNNN ;. 例如,用于&gt;的十进制等价物 是>,而十六进制是&#x3E ;;; 在这种情况下,该方法将收到'62'或'x3E'。

HTMLParser.handle_comment(data)

遇到注释时会调用此方法(例如<!--comment-->)。

例如,注释<!-- comment -->将导致使用参数调用此方法' comment '

Internet Explorer条件注释(condcoms)的内容也将发送到此方法,因此<!--[if IE 9]>IE9-specific content<![endif]-->,此方法将收到'[if IE 9]>IE9-specific content<![endif]'

HTMLParser.handle_decl(decl)

调用此方法来处理HTML doctype声明(例如<!DOCTYPE html>)。

DECL参数将是内部的声明中的全部内容<!...>的标记(例如'DOCTYPE html')。

HTMLParser.handle_pi(data)

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

注意

HTMLParser级用来处理指令的SGML语法规则。使用尾随的XHTML处理指令'?'将导致该数据'?'包含在数据中

HTMLParser.unknown_decl(data)

当解析器读取无法识别的声明时调用此方法。

数据参数将成为<![]]标记内声明的全部内容。 被派生类覆盖有时很有用。

3.例子

下面的类实现了一个解析器,将用于说明更多示例:

from HTMLParser import HTMLParser
from htmlentitydefs 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 = 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()

解析文档类型:

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

解析具有几个属性和标题的元素:

>>> parser.feed('<img src="python-logo.png" alt="The Python logo">')
Start tag: img
     attr: ('src', 'python-logo.png')
     attr: ('alt', 'The Python logo')
>>>
>>> parser.feed('<h1>Python</h1>')
Start tag: h1
Data     : Python
End tag  : h1

内容scriptstyle元素按原样返回,无需进一步解析:

>>> parser.feed('<style type="text/css">#python { color: green }</style>')
Start tag: style
     attr: ('type', 'text/css')
Data     : #python { color: green }
End tag  : style

>>> parser.feed('<script type="text/javascript">'
...             'alert("<strong>hello!</strong>");</script>')
Start tag: script
     attr: ('type', 'text/javascript')
Data     : alert("<strong>hello!</strong>");
End tag  : script

解析评论:

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

解析命名和数字字符引用并将它们转换为正确的字符(注意:这3个引用全部相同'>'):

>>> parser.feed('&gt;&#62;&#x3E;')
Named ent: >
Num ent  : >
Num ent  : >

将不完整的块送入feed()作品,但handle_data()可能会被多次调用:

>>> for chunk in ['<sp', 'an>buff', 'ered ', 'text</s', 'pan>']:
...     parser.feed(chunk)
...
Start tag: span
Data     : buff
Data     : ered
Data     : text
End tag  : span

解析无效的HTML(例如未加引号的属性)也适用:

>>> parser.feed('<p><a class=link href=#main>tag soup</p ></a>')
Start tag: p
Start tag: a
     attr: ('class', 'link')
     attr: ('href', '#main')
Data     : tag soup
End tag  : p
End tag  : a
Python

Python 是一种面向对象的解释型计算机程序设计语言,由荷兰人 Guido van Rossum 于1989年发明,第一个公开发行版发行于1991年。 Python 是纯粹的自由软件, 源代码和解释器 CPython 遵循 GPL 协议。Python 语法简洁清晰,特色之一是强制用空白符( white space )作为语句缩进。

主页 https://www.python.org/
源码 https://github.com/python/cpython
版本 2.7
发布版本 2.7.13

Python目录

1.内置常量 | Built-in Constants
2.内置例外 | Built-in Exceptions
3.内置函数 | Built-in Functions
4.内置类型 | Built-in Types
5.编译器 | Compiler
6.加密 | Cryptography
7.数据压缩 | Data Compression
8.数据持久性 | Data Persistence
9.数据类型 | Data Types
10.调试和分析 | Debugging & Profiling
11.开发工具 | Development Tools
12.文件和目录访问 | File & Directory Access
13.文件格式 | File Formats
14.构架 | Frameworks
15.输入 | Importing
16.输入/输出 | Input/ouput
17.国际化 | Internationalization
18.网络 | Internet
19.网络数据 | Internet Data
20.翻译 | Interpreters
21.语言 | Language
22.记录 | Logging
23.Mac OS
24.MS Windows
25.多媒体 | Multimedia
26.联网 | Networking
27.数字与数学 | Numeric & Mathematical
28.操作系统 | Operating System
29.可选操作系统 | Optional Operating System
30.限制执行 | Restricted Execution
31.运行 | Runtime
32.SGI IRIX
33.软件包装与分销 | Software Packaging & Distribution
34.字符串 | String
35.结构化标记 | Structured Markup
36.Tk
37.Unix
38.Python 简介
39.Python pass 语句
40.Python 循环嵌套
41.Python 运算符
42.Python log10() 函数
43.Python log() 函数
44.Python floor() 函数
45.Python fabs() 函数
46.Python exp() 函数
47.Python cmp() 函数
48.Python ceil() 函数
49.Python abs() 函数
50.Python Number(数字)
51.Python pow() 函数
52.Python modf() 函数
53.Python min() 函数
54.Python max() 函数
55.Python asin() 函数
56.Python acos() 函数
57.Python uniform() 函数
58.Python shuffle() 函数
59.Python seed() 函数
60.Python random() 函数
61.Python randrange() 函数
62.Python choice() 函数
63.Python sqrt() 函数
64.Python round() 函数
65.Python radians() 函数
66.Python degrees() 函数
67.Python tan() 函数
68.Python sin() 函数
69.Python hypot() 函数
70.Python cos() 函数
71.Python atan2() 函数
72.Python atan() 函数
73.Python 元组
74.Python 列表(List)
75.Python 字符串
76.Python 字典(Dictionary)
77.Python 日期和时间
78.Python 函数
79.Python 模块
80.Python capitalize()方法
81.Python center()方法
82.Python count() 方法
83.Python expandtabs()方法
84.Python endswith()方法
85.Python encode()方法
86.Python decode()方法
87.Python find()方法
88.Python index()方法
89.Python 异常处理
90.Python isspace()方法
91.Python isnumeric()方法
92.Python islower()方法
93.Python isdigit()方法
94.Python isalpha()方法
95.Python isalnum()方法
96.Python isupper()方法
97.Python istitle()方法
98.Python min()方法
99.Python max()方法
100.Python maketrans()方法