[zz]Python HTML 解析
1 Python HTML 解析
1.1 缘由
为了将CHM文件转变成Devhelp支持的格式,以便用devhelp来阅读。 解析索引文件,构建标签。
HTML -> XML
作为一个标记语言,HTML其实是一个结构化的文本,对它的处理,可以分三步:
- 分解
-
将HTML文档按照标记分分解,得到一些列的小的片段。
- 处理
-
对这些小片段进行处理。
- 组合
-
将处理过的片段重新组合。
三个步骤中,第一步可由Python自带的sgmlib来完成。
1.2 SGMLib
sgmlib 中包含了一个重要的类:SGMLParser, 这个可以将一个HTML文档根据Tag解析 成为很多的片段,并根据Tag类型来调用该类中相应的函数来处理这些片段。为了按照 自己的意愿来处理这些片段,我们需要从SGMLparser继承出一个新类,然后重写其中 的Tag的处理函数。
SGMLib 可将HTML解析成为8种类型的数据,并对每种数据调用相应的函数。
- Start tag
- 标记一个文本块的开始的Tag, 如 <html>, <head>, <body>, <pre>, <br>, <img>
等等。 - 相应函数为: start_tagname, 或者 do_tagname,
- 参数为该Tag的Attribute。
例如, 对<pre>这个Tag,如果start_pre或者do_pre存在,则这两个函数会被调 用;如果这两个函数不存在,则调用缺省函数: unknown_starttag。
- 标记一个文本块的开始的Tag, 如 <html>, <head>, <body>, <pre>, <br>, <img>
- End tag
- 标记文本块结束的Tag,如 </html>, </body>等。
- 对应函数: end_tagname, 如end_pre,
- 参数:None
- Character reference
- 转义的字符。HTML中以&加上数字表示转义。
- 对应函数: handle_charref
- 参数:被转义的数字。
- Entity reference
- HTML entity, 如 ©
- 对应函数: handleentityref
- 参数: Entity的名字。
- Comment
- HTML comment, 形如 <!– … –>.
- 对应函数: handlecomment
- 参数:comment的内容。
- Processing instruction
- HTML中的处理指令,形如: <? … >.
- 对应函数:handlepi
- 参数 Instruction 的内容
- Declaration
- HTML的声明,例如DOCTYPE。
- 对应函数:handledecl
- 参数: Declaration的内容
- Text data
- 文本段,指除了上述7种以外的所有文本。
- 对应函数: handledata.
- 参数: 文本内容