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 "
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 "