sgmllib Introduction

17 篇文章 0 订阅
6 篇文章 0 订阅

8.2.sgmllib.py介绍

 

HTML处理分成三步:将HTML分解成它的组成片段,对片段进行加工,接着将片段再重新合成 HTML。第一步是通过sgmllib.py来完成的,它是标准Python库的一部分。

理解本章的关键是要知道HTML不只是文本,更是结构化文本。这种结构来源于开始与结束标记的或多或少分级序列。通常您并不以这种方式处理HTML,而是以文本方式在一个文本编辑中对其进行处理,或以可视的方式在一个浏览器中进行浏览或页面编辑工具中进行编辑。sgmllib.py表现出了HTML结构

sgmllib.py包含一个重要的类:SGMLParserSGMLParserHTML分解成有用的片段,比如开始标记和结束标记。在它成功地分解出某个数据为一个有用的片段后,它会根据所发现的数据,调用一个自身内部的方法。为了使用这个分析器,您需要子类化SGMLParser类,并且覆盖这些方法。这就是当我说它表示了HTML结构的意思:HTML的结构决定了方法调用的次序和传给每个方法的参数。

SGMLParserHTML分析成 8 类数据,然后对每一类调用单独的方法:

开始标记 (Start tag)
是开始一个块的 HTML标记,像 <html><head><body><pre>等,或是一个独一的标记,像 <br><img>等。当它找到一个开始标记 tagnameSGMLParser将查找名为 start_tagnamedo_tagname的方法。例如,当它找到一个 <pre>标记,它将查找一个 start_predo_pre的方法。如果找到了, SGMLParser会使用这个标记的属性列表来调用这个方法;否则,它用这个标记的名字和属性列表来调用 unknown_starttag方法。
结束标记 (End tag)
是结束一个块的 HTML标记,像 </html></head></body></pre>等。当找到一个结束标记时, SGMLParser将查找名为 end_tagname的方法。如果找到, SGMLParser调用这个方法,否则它使用标记的名字来调用 unknown_endtag
字符引用 (Character reference)
用字符的十进制或等同的十六进制来表示的转义字符,像 &#160;。当找到, SGMLParser使用十进制或等同的十六进制字符文本来调用 handle_charref
实体引用 (Entity reference)
HTML实体,像 &copy;。当找到, SGMLParser使用 HTML实体的名字来调用 handle_entityref
注释 (Comment)
HTML注释,包括在 <!-- ... -->之间。当找到, SGMLParser用注释内容来调用 handle_comment
处理指令 (Processing instruction)
HTML处理指令,包括在 <? ... >之间。当找到, SGMLParser用处理指令内容来调用 handle_pi
声明 (Declaration)
HTML声明,如 DOCTYPE,包括在 <! ... >之间。当找到, SGMLParser用声明内容来调用 handle_decl
文本数据 (Text data)
文本块。不满足其它 7 种类别的任何东西。当找到, SGMLParser用文本来调用 handle_data

重要
Python2.0 存在一个 bug,即SGMLParser完全不能识别声明 (handle_decl永远不会调用),这就意味着DOCTYPE被静静地忽略掉了。这个错误在Python2.1 中改正了。

sgmllib.py所附带的一个测试套件举例说明了这一点。您可以运行sgmllib.py,在命令行下传入一个HTML文件的名字,然后它会在分析标记和其它元素的同时将它们打印出来。它的实现是通过子类化SGMLParser类,然后定义unknown_starttagunknown_endtaghandle_data和其它方法来实现的。这些方法简单地打印出它们的参数。

提示
在 Windows 下的ActivePythonIDE中,您可以在 “Run script” 对话框中指定命令行参数。用空格将多个参数分开。

例8.4.sgmllib.py的样例测试

下面是一个片段,来自本书的HTML版本的目录,toc.html。当然,您的存储路径可能与我的有所不同。 (如果您还没有下载本书的HTML版本,可以从http://diveintopython.org/下载。

c:\python23\lib> type "c:\downloads\diveintopython\html\toc\index.html"

<!DOCTYPE html
  PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html lang="en">
   <head>
      <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
   
      <title>Dive Into Python</title>
      <link rel="stylesheet" href="diveintopython.css" type="text/css">

... 略 ...

通过sgmllib.py的测试套件来运行它,会得到如下的输出结果:

c:\python23\lib> python sgmllib.py "c:\downloads\diveintopython\html\toc\index.html"
data: '\n\n'
start tag: <html lang="en" >
data: '\n   '
start tag: <head>
data: '\n      '
start tag: <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" >
data: '\n   \n      '
start tag: <title>
data: 'Dive Into Python'
end tag: </title>
data: '\n      '
start tag: <link rel="stylesheet" href="diveintopython.css" type="text/css" >
data: '\n      '

... 略 ...

下面是本章其它部分的路标:

  • 子类化SGMLParser来创建从HTML文档中抽取感兴趣的数据的类。
  • 子类化SGMLParser来创建BaseHTMLProcessor,它覆盖了所有8个处理方法,然后使用它们从片段中重建原始的HTML
  • 子类化BaseHTMLProcessor来创建Dialectizer,它增加了一些方法,专门用来处理指定的HTML标记,然后覆盖了handle_data方法,提供了用来处理HTML标记之间文本块的框架。
  • 子类化Dialectizer来创建定义了文本处理规则的类。这些规则被Dialectizer.handle_data使用。
  • 编写一个测试套件,它可以从http://diveintopython.org/处抓取一个真正的 web 页面,然后处理它。

继续阅读本章,您还可以学习到有关localsglobals和基于 dictionary 的字符串格式化的内容。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
python模块详解 各个模块的详解 核心模块 1.1. 介绍 1.2. _ _builtin_ _ 模块 1.3. exceptions 模块 1.4. os 模块 1.5. os.path 模块 1.6. stat 模块 1.7. string 模块 1.8. re 模块 1.9. math 模块 1.10. cmath 模块 1.11. operator 模块 1.12. copy 模块 1.13. sys 模块 1.14. atexit 模块 1.15. time 模块 1.16. types 模块 1.17. gc 模块 更多标准模块 2.1. 概览 2.2. fileinput 模块 2.3. shutil 模块 2.4. tempfile 模块 2.5. StringIO 模块 2.6. cStringIO 模块 2.7. mmap 模块 2.8. UserDict 模块 2.9. UserList 模块 2.10. UserString 模块 2.11. traceback 模块 2.12. errno 模块 2.13. getopt 模块 2.14. getpass 模块 2.15. glob 模块 2.16. fnmatch 模块 2.17. random 模块 2.18. whrandom 模块 2.19. md5 模块 2.20. sha 模块 2.21. crypt 模块 2.22. rotor 模块 2.23. zlib 模块 2.24. code 模块 线程和进程 3.1. 概览 3.2. threading 模块 3.3. Queue 模块 3.4. thread 模块 3.5. commands 模块 3.6. pipes 模块 3.7. popen2 模块 3.8. signal 模块 数据表示 4.1. 概览 4.2. array 模块 4.3. struct 模块 4.4. xdrlib 模块 4.5. marshal 模块 4.6. pickle 模块 4.7. cPickle 模块 4.8. copy_reg 模块 4.9. pprint 模块 4.10. repr 模块 4.11. base64 模块 4.12. binhex 模块 4.13. quopri 模块 4.14. uu 模块 4.15. binascii 模块 文件格式 5.1. 概览 5.2. xmllib 模块 5.3. xml.parsers.expat 模块 5.4. sgmllib 模块 5.5. htmllib 模块 5.6. htmlentitydefs 模块 5.7. formatter 模块 5.8. ConfigParser 模块 5.9. netrc 模块 5.10. shlex 模块 5.11. zipfile 模块 5.12. gzip 模块 邮件和新闻消息处理 6.1. 概览 6.2. rfc822 模块 6.3. mimetools 模块 6.4. MimeWriter 模块 6.5. mailbox 模块 6.6. mailcap 模块 6.7. mimetypes 模块 6.8. packmail 模块 6.9. mimify 模块 6.10. multifile 模块 网络协议 7.1. 概览 7.2. socket 模块 7.3. select 模块 7.4. asyncore 模块 7.5. asynchat 模块 7.6. urllib 模块 7.7. urlparse 模块 7.8. cookie 模块 7.9. robotparser 模块 7.10. ftplib 模块 7.11. gopherlib 模块 7.12. httplib 模块 7.13. poplib 模块 7.14. imaplib 模块 7.15. smtplib 模块 7.16. telnetlib 模块 7.17. nntplib 模块 7.18. SocketServer 模块 7.19. BaseHTTPServer 模块 7.20. SimpleHTTPServer 模块 7.21. CGIHTTPServer 模块 7.22. cgi 模块 7.23. webbrowser 模块 国际化 8.1. locale 模块 8.2. unicodedata 模块 8.3. ucnhash 模块 多媒体相关模块 9.1. 概览 9.2. imghdr 模块 9.3. sndhdr 模块 9.4. whatsound 模块 9.5. aifc 模块 9.6. sunau 模块 9.7. sunaudio 模块 9.8. wave 模块 9.9. audiodev 模块 9.10. winsound 模块 数据储存 10.1. 概览 10.2. anydbm 模块 10.3. whichdb 模块 10.4. shelve 模块 10.5. dbhash 模块 10.6. dbm 模块 10.7. dumbdbm 模块 10.8. gdbm 模块 工具和实用程序 11.1. dis 模块 11.2. pdb 模块 11.3. bdb 模块 11.4. profile 模块 11.5. pstats 模块 11.6. tabnanny 模块 其他模块 12.1. 概览 12.2. fcntl 模块 12.3. pwd 模块 12.4. grp 模块 12.5. nis 模块 12.6. curses 模块 12.7. termios 模块 12.8. tty 模块 12.9. resource 模块 12.10. syslog 模块 12.11. msvcrt 模块 12.12. nt 模块 12.13. _winreg 模块 12.14. posix 模块 执行支持模块 13.1. dospath 模块 13.2. macpath 模块 13.3. ntpath 模块 13.4. posixpath 模块 13.5. strop 模块 13.6. imp 模块 13.7. new 模块 13.8. pre 模块 13.9. sre 模块 13.10. py_compile 模块 13.11. compileall 模块 13.12. ihooks 模块 13.13. linecache 模块 13.14. macurl2path 模块 13.15. nturl2path 模块 13.16. tokenize 模块 13.17. keyword 模块 13.18. parser 模块 13.19. symbol 模块 13.20. token 模块 其他模块 14.1. 概览 14.2. pyclbr 模块 14.3. filecmp 模块 14.4. cmd 模块 14.5. rexec 模块 14.6. Bastion 模块 14.7. readline 模块 14.8. rlcompleter 模块 14.9. statvfs 模块 14.10. calendar 模块 14.11. sched 模块 14.12. statcache 模块 14.13. grep 模块 14.14. dircache 模块 14.15. dircmp 模块 14.16. cmp 模块 14.17. cmpcache 模块 14.18. util 模块 14.19. soundex 模块 14.20. timing 模块 14.21. posixfile 模块 14.22. bisect 模块 14.23. knee 模块 14.24. tzparse 模块 14.25. regex 模块 14.26. regsub 模块 14.27. reconvert 模块 14.28. regex_syntax 模块 14.29. find 模块

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值