使用SGMLParser和urllib解析HTML文件

使用SGMLParser和urllib解析HTML文件
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 实体,象 &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.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

你可能感兴趣的:(使用SGMLParser和urllib解析HTML文件)