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>的东西
其他的实现都大同小异。
转载请注明原文地址: https://ju.6miu.com/read-200379.html