孤独的猫

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

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"

posted on 2011-07-08 22:00  孤独的猫  阅读(315)  评论(0编辑  收藏  举报