网络爬虫之HTMLParser

    xiaoxiao2021-03-25  19

    HTMLParserpython自带的网页解析工具,使用很简单。便于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_starttagparse_endtag里面实现handle_endtag 代码中的handle_starttaghandle_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_starttaghandle_endtaghandle_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>的东西 其他的实现都大同小异。

    转载请注明原文地址: https://ju.6miu.com/read-200379.html

    最新回复(0)