sgmllib.py 包含一个重要的类:
SGMLParser。
SGMLParser 将
HTML 分解成有用的片段,比如开始标记和结束标记。一旦它成功地分解出某个数据为一个有用的片段,它会根据所发现的数据,调用一个自身内部的方法。为了使用这个分析器,您需要子类化
SGMLParser 类,并且覆盖这些方法。
SGMLParser 将
HTML 分析成 8 类数据,然后对每一类调用单独的方法:
开始标记 (Start tag)
是一个开始一个块的 HTML 标记,象 <html>,<head>,<body> 或 <pre> 等,或是一个独一的标记,象 <br> 或 <img> 等。当它找到一个开始标记 tagname,SGMLParser 将查找名为 start_tagname 或 do_tagname 的方法。例如,当它找到一个 <pre> 标记,它将查找一个 start_pre 或 do_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 实体,象 ©。当找到,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.reset 由
SGMLParser 的
__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
周锐 阅读(2194)
评论(0) 编辑 收藏 所属分类:
Python