sgmllib.py 包含一个重要的类: SGMLParser。SGMLParser 将 HTML 分解成有用的片段, 比如开始标记和结束标记。一旦它成功地分解出某个数据为一个有用的片段,它会根据 所发现的数据,调用一个自身内部的方法。为了使用这个分析器,您需要子类化 SGML- Parser类,并且覆盖这些方法。
SGMLParser类里面包含了很多内部方法,开始读取html后,遇到相应的数据就会调用其对应的方法,最重要的方法有三个:
- start_tagname(self, attrs)
- end_tagname(self)
- handle_data(self, text)
tagname就是标签名称,比如当遇到<pre>,就会调用start_pre,遇到</pre>,就会调用 end_pre,attrs即为标签的参数,以[(attribute, value), (attribute, value), ...]的形式传回,我们要做的就是在其子类重载自己感兴趣标签对应的函数。
from sgmllib import SGMLParser
import urllib
import urllib2
import socket
socket.setdefaulttimeout(210)
class URLLister(SGMLParser):
def reset(self):
self.url=[]
SGMLParser.reset(self)
def start_a(self,attrs):
href=[v for k,v in attrs if k=='href']
if href:
self.url.extend(href)
parser=URLLister()
myurl='http://www.sina.com.cn'
request=urllib2.Request(myurl)
opener=urllib2.build_opener()
page=opener.open(request)
if page.code==200:
predata=page.read()
parser.feed(predata)
print parser.url,"\n"