posts - 431,  comments - 344,  trackbacks - 0
sgmllib.py 包含一个重要的类: SGMLParserSGMLParserHTML 分解成有用的片段,比如开始标记和结束标记。一旦它成功地分解出某个数据为一个有用的片段,它会根据所发现的数据,调用一个自身内部的方法。为了使用这个分析器,您需要子类化 SGMLParser 类,并且覆盖这些方法。
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)
用字符的十进制或等同的十六进制来表示的转义字符,象  。当找到,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

urllib 模块是标准 Python 库的一部分。它包含了一些函数,可以从基于互联网的 URL (主要指网页) 来获取信息并且真正取回数据。urllib 模块最简单的使用是提取用 urlopen 函数取回的网页的整个文本。打开一个 URL打开一个文件相似。urlopen 的返回值是象文件一样的对象,它具有一个文件对象一样的方法。使用由 urlopen 所返回的类文件对象所能做的最简单的事情就是 read,它可以将网页的整个 HTML 读到一个字符串中。这个对象也支持 readlines 方法,这个方法可以将文本按行放入一个列表中。当用完这个对象,要确保将它 close,就如同一个普通的文件对象。

 urllister.py

from sgmllib import SGMLParser

class URLLister(SGMLParser):
    def reset(self):
        SGMLParser.reset(self)
        self.urls=[]
        self.imgs=[]
    def start_a(self, attrs):
        href = [v for k, v in attrs if k=='href']
        if href:
            self.urls.extend(href)
    def start_img(self, attrs):
        img = [v for k, v in attrs if k=='src']
        if img:
            self.imgs.extend(img)

1.resetSGMLParser__init__ 方法来调用,也可以在创建一个分析器实例时手工来调用。所以如果您需要做初始化,在 reset 中去做,而不要在 __init__ 中做。这样当某人重用一个分析器实例时,会正确地重新初始化。
2.象 k=='href' 的字符串比较是区分大小写的,但是这里是安全的。因为 SGMLParser 会在创建 attrs 时将属性名转化为小写。
test.py
import urllib, urllister
usock=urllib.urlopen("http://www.blogjava.net/rain1102")
parser=urllister.URLLister()
parser.feed(usock.read())
usock.close()
parser.close()
for url in parser.urls:print url
for img in parser.imgs:print img
posted on 2007-10-17 10:51 周锐 阅读(2195) 评论(0)  编辑  收藏 所属分类: Python

只有注册用户登录后才能发表评论。


网站导航: