一个例子
复制代码 代码如下:
from htmlparser import htmlparser
class myhtmlparser(htmlparser):
def handle_starttag(self, tag, attrs):
print a start tag:,tag,self.getpos()
parser=myhtmlparser()
parser.feed('hello
')
这个例子里htmlparser是基类,重载了他的handle_starttag方法,输出了一些信息.parser是myhtmlparser的实例,调用feed方法开始解析函数.值得注意的是,不需要显示调用handle_starttag方法就会执行.htmlparser方法的调用方式困惑了我很长时间,看了很多博文才恍然大悟,htmlparser含有的方法分为两类,一类是需要显式调用的,而另一类不需显示调用.
不需显式调用的方法
下面的这些函数在解析的过程中会触发,但是默认情况下不会产生任何副作用,因而我们要根据自己的需求重载.
1.htmlparser.handle_starttag(tag,attrs): 解析时遇到开始标签调用,如
,参数tag是标签名,这里是'p',attrs为标签所有属性(name,value)列表,这里是[('class','para')]
2.htmlparser.handle_endtag(tag): 遇到结束标签时调用,tag是标签名
3.htmlpars.handle_data(data): 遇到标签中间的内容时调用,如,参数data为开闭标签间的内容.值得注意的是在形如
...
的位置,并不会在div处调用,而是只在p处调用当然还有其他函数,这里不做介绍
显式调用的方法
1.htmlparser.feed(data): 参数为需要解析的html字符串,调用后字符串开始被解析
2.htmlparser.getpos(): 返回当前的行号和偏移位置,如(23,5)
3.htmlparser.get_starttag_text(): 返回当前位置最近的开始标签的内容
所有的内容写完了,最后还有一点注意事项,htmlparser只是一个简单的模块,解析html的功能并不完善,例如不能准确的分别开标签和自闭标签,看下面代码:
复制代码 代码如下:
from htmlparser import htmlparser
class myhtmlparser(htmlparser):
def handle_starttag(self,tag,attrs):
print 'begin tag',tag
def handle_startendtag(self,tag,attrs):
print 'begin end tag',tagstr1='
'
str2='
'
parser=myhtmlparser()
parser.feed(str1) # 输出 begin tag br
parser.feed(str2) # 输出 begin end br