在线文档教程

sgmllib

sgmllib - 简单的SGML分析器

自2.6版以来已弃用:该sgmllib模块已在Python 3中删除。

该模块定义了一个类SGMLParser,它用作解析SGML(标准通用标记语言)格式的文本文件的基础。 实际上,它并没有提供完整的SGML解析器 - 它只解析SGML,只要它被HTML使用,并且该模块仅作为htmllib模块的基础存在。 HTMLParser模块提供了另一个支持XHTML并提供了一些不同接口的HTML解析器。

class sgmllib.SGMLParser

SGMLParser类实例化没有参数。解析器被硬编码以识别以下结构:

  • 打开和关闭<tag attr =“value”...>和</ tag>标签。

  • 表单&#的形式的数字字符引用。

  • 表单的实体引用&name;

  • SGML评论形式<! - text - >。 请注意,空格,制表符和换行符允许在尾部>和紧接的前一个之间。

一个例外也被定义为:

exception sgmllib.SGMLParseError

SGMLParser类在解析时遇到错误时引发的异常。

2.1版本中的新功能。

SGMLParser 实例具有以下方法:

SGMLParser.reset()

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

SGMLParser.setnomoretags()

停止处理标签。将所有后续输入视为文字输入(CDATA)。(只有这样<PLAINTEXT>才能实现HTML标签。)

SGMLParser.setliteral()

进入文字模式(CDATA模式)。

SGMLParser.feed(data)

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

SGMLParser.close()

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

SGMLParser.get_starttag_text()

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

SGMLParser.handle_starttag(tag, method, attributes)

调用此方法来处理已定义start_tag()或do_tag()方法的开始标记。 标记参数是转换为小写的标记的名称,方法参数是应该用于支持开始标记的语义解释的绑定方法。 attributes参数是一个包含标签<>括号内的属性的(名称,值)对列表。

该名称已被翻译成小写。 已经解释了该值中的双引号和反斜杠,以及已知字符引用和已知实体引用以分号结尾(通常,实体引用可以由任何非字母数字字符终止,但这会破坏< 当鸡蛋是有效的实体名称时,HREF =“url?spam = 1&eggs = 2”>)。

例如,对于<A HREF="http://www.cwi.nl/">这个标签,这个方法将被称为unknown_starttag('a',[('href','http://www.cwi.NL/')])。 基本实现只是简单地调用具有属性的方法作为唯一的参数。

2.5版新增功能:处理属性值中的实体和字符引用。

SGMLParser.handle_endtag(tag, method)

调用此方法来处理已定义end_tag()方法的尾标签。 标记参数是转换为小写的标记的名称,方法参数是应该用于支持结束标记的语义解释的绑定方法。 如果没有为关闭元素定义end_tag()方法,则不调用此处理程序。 基本实现只是简单地调用方法。

SGMLParser.handle_data(data)

调用此方法来处理任意数据。它打算被派生类覆盖; 基类实现什么都不做。

SGMLParser.handle_charref(ref)

调用此方法来处理&#ref ;.表单的字符引用。 基本实现使用convert_charref()将引用转换为字符串。 如果该方法返回一个字符串,则将其传递给handle_data(),否则调用unknown_charref(ref)来处理该错误。

在版本2.5中进行了更改:使用convert_charref()而不是对转换进行硬编码。

SGMLParser.convert_charref(ref)

将字符引用转换为字符串或None。 ref是以字符串形式传入的引用。 在基本实现中,ref必须是0-255范围内的十进制数。 它转换使用convert_codepoint()方法找到的代码点。 如果ref无效或超出范围,则此方法返回无。 此方法由默认的handle_charref()实现和属性值解析器调用。

2.5版本中的新功能。

SGMLParser.convert_codepoint(codepoint)

将代码点转换为str值。 在适当的情况下,可以在这里处理编码,尽管sgmllib的其余部分在这个问题上是不知情的。

2.5版本中的新功能。

SGMLParser.handle_entityref(ref)

调用此方法来处理形式为&ref;的通用实体引用。 其中ref是一般实体参考。 它通过将ref传递给convert_entityref()来转换ref。 如果一个翻译被返回,它会在翻译中调用handle_data()方法; 否则,它调用方法unknown_entityref(ref)。 默认的entitydefs为&amp;,&,&,&,&lt;和&quot;定义了翻译。

在版本2.5中进行了更改:使用convert_entityref()而不是对转换进行硬编码。

SGMLParser.convert_entityref(ref)

将已命名的实体引用转换为str值或None。 结果值不会被解析。 ref将只是实体的名称。 默认实现在实例(或类)变量entitydefs中查找ref,它应该是从实体名称到相应翻译的映射。 如果ref没有可用的翻译,则此方法返回None。 该方法由默认的handle_entityref()实现和属性值解析器调用。

2.5版本中的新功能。

SGMLParser.handle_comment(comment)

此方法在遇到注释时调用。 comment参数是一个包含<! - 和 - >分隔符之间文本的字符串,但不包含分隔符本身。 例如,注释<! - text - >将导致使用参数'text'调用此方法。 默认方法什么都不做。

SGMLParser.handle_decl(data)

在解析器读取SGML声明时调用的方法。 实际上,DOCTYPE声明是在HTML中唯一观察到的,但解析器不区分不同的(或破坏的)声明。 DOCTYPE声明中的内部子集不受支持。 数据参数将是<!...>标记内声明的全部内容。 默认实现什么都不做。

SGMLParser.report_unbalanced(tag)

当找到与任何打开元素都不对应的结束标记时,将调用此方法。

SGMLParser.unknown_starttag(tag, attributes)

调用此方法来处理未知的开始标记。它打算被派生类覆盖; 基类实现什么都不做。

SGMLParser.unknown_endtag(tag)

调用此方法来处理未知的结束标记。它打算被派生类覆盖; 基类实现什么都不做。

SGMLParser.unknown_charref(ref)

调用此方法来处理不可解析的数字字符引用。请参阅handle_charref()确定默认处理的内容。它打算被派生类覆盖; 基类实现什么都不做。

SGMLParser.unknown_entityref(ref)

调用此方法来处理未知的实体引用。它打算被派生类覆盖; 基类实现什么都不做。

除了重写或扩展上面列出的方法之外,派生类还可以定义以下形式的方法来定义特定标记的处理。输入流中的标签名称与个案无关; 方法名称中出现的标签必须采用小写形式:

SGMLParser.start_tag(attributes)

调用此方法来处理开始标记标记。 它优先于do_tag()。 attributes参数的含义与上述handle_starttag()所描述的相同。

SGMLParser.do_tag(attributes)

调用此方法来处理未定义start_tag()方法的开始标记标记。 attributes参数的含义与上述handle_starttag()所描述的相同。

SGMLParser.end_tag()

调用此方法来处理结束标记tag

请注意,解析器维护一堆尚未找到结束标记的打开元素。 只有由start_tag()处理的标签被推送到这个堆栈上。 这些标签的end_tag()方法的定义是可选的。 对于由do_tag()或者unknown_tag()处理的标签,不必定义end_tag()方法。 如果定义,它将不会被使用。 如果标记都存在start_tag()和do_tag()方法,则start_tag()方法优先。