HTMLParser是python自带的网页解析工具,使用很简单。便于HTML文件的解析
下面我们来看相关代码:
class Newparser(HTMLParser): def __init__(self): HTMLParser.__init__(self) self.flag=False self.text=[] def handle_starttag(self,tag,attrs): if tag == 'span': self.flag=True def handle_data(self, data): if self.flag == True: print data self.text.append(data) def handle_endtag(self, tag): if tag == 'span': self.flag=False if __name__=="__main__": parser=Newparser() try: req=urllib2.Request('http://www.xunsee.com/article/8c39f5a0-ca54-44d7-86cc-148eee4d6615/index.shtml') fd=urllib2.urlopen(req) parser.feed(fd.read()) print parser.text except BaseException,e: print e
首先定义一个类继承自HTMLParser.在__init__函数中定义一些自己的参数。
parser.feed(fd.read()) 其中feed函数是类自带的函数。参数就是网页的HTML代码。其中feed相当于一个驱动函数。我们来看下feed函数的原型。下面是feed的实现。可以看到实现了2个功能。其中就是将传入的网页代码赋值给rawdata。然后运行goahead开始进行处理
def feed(self, data): r"""Feed data to the parser. Call this as often as you want, with as little or as much text as you want (may include '\n'). """ self.rawdata = self.rawdata + data self.goahead(0)
goahead函数代码过多,这里就不全部贴出来,具体功能就是遍历rawdata每行数据。然后根据的不同标识调用不同的函数。关键函数如下。可以看到当遇到’<’开始的时候。调用parse_startag,当遇到’</’调用parse_endtag
parse_startag里面实现handle_starttag,parse_endtag里面实现handle_endtag。
代码中的handle_starttag和handle_endtag是个空函数。只是传入了当前的tag以及attrs.这就给了我们重写此函数的机会
def handle_starttag(self, tag, attrs): pass
def handle_endtag(self, tag): pass
def handle_data(self, data): pass
其中hanle_data是处理网页代码中的具体数据
说了这么多,应该对HTMLParser的实现很清楚了。对每行网页代码进行处理。依次判断是否进入handle_starttag,handle_endtag,handle_data handle_endtag 处理结束标签,比如</xx> handle_entityref 处理一些特殊字符,以&开头的,比如 handle_data 处理数据,就是<xx>data</xx>中间的那些数据<span lang="EN-US" style="" font-size:6.5pt;"=""> handle_comment 处理注释 handle_decl 处理<!开头的,比如<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" handle_pi 处理形如<?instruction>的东西其他的实现都大同小异。