19.3. htmllib — HTML 文档的解析器
从 2.6 版开始不推荐使用:Python 3 中删除了htmllib模块。在 Python 2 中使用了HTMLParser,在 Python 3 中等效了html.parser
。
该模块定义了一个类,该类可以用作解析以超文本标记语言(HTML)格式化的文本文件的基础。该类与 I/O 没有直接关系,它必须pass方法以字符串形式提供 Importing,并调用“格式器”对象的方法以产生输出。 HTMLParser类旨在用作其他类的 Base Class,以添加Function,并允许其大多数方法被扩展或覆盖。反过来,此类也从模块sgmllib中定义的SGMLParser
类派生并扩展。 HTMLParser实现支持 RFC 1866中描述的 HTML 2.0 语言。 formatter模块中提供了格式化程序对象的两种实现。有关格式化程序接口的信息,请参阅该模块的文档。
以下是sgmllib.SGMLParser定义的接口的摘要:
- 将数据馈送到实例的接口是pass
feed()
方法实现的,该方法带有一个字符串参数。可以根据需要一次或多或少地调用它。p.feed(a); p.feed(b)
与p.feed(a+b)
具有相同的效果。当数据包含完整的 HTML 标记构造时,将立即对其进行处理。不完整的构造将保存在缓冲区中。要强制处理所有未处理的数据,请调用close()
方法。
例如,要解析文件的全部内容,请使用:
parser.feed(open('myfile.html').read())
parser.close()
- 定义 HTML 标签语义的接口非常简单:派生一个类并定义名为
start_tag()
,end_tag()
或do_tag()
的方法。解析器将在适当的时候调用它们:当遇到<tag ...>
形式的开始标记时,调用start_tag()
或do_tag()
;否则,将调用start_tag()
或do_tag()
。当遇到格式为<tag>
的结束标记时,将调用end_tag()
。如果一个开始标记需要一个相应的结束标记,例如<H1>
…</H1>
,则该类应定义start_tag()
方法;如果标记不需要结束标记(例如<P>
),则该类应定义do_tag()
方法。
该模块定义了一个解析器类和一个异常:
-
类别
htmllib.
HTMLParser
(格式器)- 这是基本的 HTML 解析器类。它支持 XHTML 1.0 Recommendation(https://www.w3.org/TR/xhtml1)要求的所有实体名称。它还为所有 HTML 2.0 以及许多 HTML 3.0 和 3.2 元素定义了处理程序。
-
exception
htmllib.
HTMLParseError
- HTMLParser类在解析时遇到错误时引发的异常。
2.4 版的新Function。
See also
-
Module formatter
-
接口定义,用于将格式化事件的抽象流转换为写入器对象上的特定输出事件。
-
Module HTMLParser
-
备用 HTML 解析器,它提供 Importing 的较低层视图,但旨在与 XHTML 一起使用,并且未实现一些“在部署的 HTML 中不使用的” SGML 语法,并且对于 XHTML 而言是不合法的。
-
Module htmlentitydefs
-
XHTML 1.0 实体的替换文本的定义。
-
Module sgmllib
-
HTMLParser的 Base Class。
19.3.1. HTMLParser 对象
除了标记方法外,HTMLParser类还提供了一些其他方法和实例变量以供在标记方法中使用。
-
HTMLParser.
formatter
- 这是与解析器关联的格式化程序实例。
-
HTMLParser.
nofill
- 布尔标志,当不应该折叠空格时应为 true,否则应为 false。通常,仅当字符数据被视为“预格式化”文本(如
<PRE>
元素内)时,才应为 true。默认值为 false。这会影响handle_data()
和save_end()的操作。
- 布尔标志,当不应该折叠空格时应为 true,否则应为 false。通常,仅当字符数据被视为“预格式化”文本(如
-
HTMLParser.
anchor_bgn
(* href , name , type *)- 在锚点区域的开头调用此方法。参数与具有相同名称的
<A>
标签的属性相对应。默认实现在文档中维护一个超链接列表(由<A>
标签的HREF
属性定义)。超链接列表可用作数据属性anchorlist
。
- 在锚点区域的开头调用此方法。参数与具有相同名称的
-
HTMLParser.
anchor_end
( )- 在锚点区域的末尾调用此方法。默认实现是使用索引将文本脚注标记添加到anchor_bgn()创建的超链接列表中。
-
HTMLParser.
handle_image
(* source , alt * [,* ismap * [,* align * [,* width * [,* height *]]]])- 调用此方法来处理图像。默认实现只是将* alt *值传递给
handle_data()
方法。
- 调用此方法来处理图像。默认实现只是将* alt *值传递给
-
HTMLParser.
save_bgn
( )- 开始将字符数据保存在缓冲区中,而不是将其发送到格式化程序对象。passsave_end()检索存储的数据。不能嵌套使用save_bgn()/save_end()对。
-
HTMLParser.
save_end
( )- 结束缓冲字符数据并返回自上次调用save_bgn()以来保存的所有数据。如果nofill标志为 false,则空白将折叠为单个空格。调用此方法而没有先调用save_bgn()将引发TypeError异常。
19.4. htmlentitydefs — HTML 通用实体的定义
Note
htmlentitydefs模块在 Python 3 中已重命名为html.entities
。2to3工具在将源转换为 Python 3 时将自动适应导入。
该模块定义了三个字典name2codepoint
,codepoint2name
和entitydefs
。 htmllib模块使用entitydefs
来提供HTMLParser类的entitydefs属性。此处提供的定义包含 XHTML 1.0 定义的所有实体,可以使用 Latin-1 字符集(ISO-8859-1)中的简单文本替换来处理这些实体。
-
htmlentitydefs.
entitydefs
- 字典,将 XHTML 1.0 实体定义 Map 到 ISO Latin-1 中的替换文本。
-
htmlentitydefs.
name2codepoint
- 将 HTML 实体名称 Map 到 Unicode 代码点的字典。
2.3 版的新Function。
htmlentitydefs.
codepoint2name
- 将 Unicode 代码点 Map 到 HTML 实体名称的字典。
2.3 版的新Function。