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()方法优先。