HTMLParser .

heruijun 2011-11-16

HTMLParser

该模块定义一个HTMLParser类,解析HTML(超文本标记语言)和HTML中的文本格式的文件。不同于htmllib中的解析器,该解析器不基于sgmllib中的SGML解析器。

classHTMLParser()

HTMLParser类的实例化不需要参数。

当标记开始和结束时,HTMLParser实例被HTML数据使用,同时调用处理函数。HTMLParser类由用户提供一个期望的行为时,意味着被重载。

不同于htmllib中的解析器,这个解析器不检查结尾的标记是否匹配开始的标记,或为通过关闭一个外部元素隐式关闭的元素调用结束标记处理器。

也定义一个异常:

exceptionHTMLParseError

当解析遇到一个错误时,HTMLParser类挂起一个异常。这个异常提供三个属性:msg是一个简短的解析错误的信息,lineno是被检测的不完善结构的行数,offset是结构开始时行内的字符数。

HTMLParser实例有下列方法:

reset()

重新设置实例。丢弃所有未处理的数据。在实例化时被隐式调用。

feed(data)

给解析器提供一些文本。它包含完整的元素时被处理;不完整的数据被缓冲直到更多的数据被导入或close()被调用时。

close()

如果所有的缓冲数据紧跟一个文件结束标记时,强制处理所有的缓冲数据。通过一个在输入结尾定义附加处理的导出类,该方法可以被重定义,但是应该一直调用HTMLParser的基础类方法close()。

getpos()

返回当前的行数和偏移。

get_starttag_text()

返回当前打开的开始标记的文本。对于结构化处理,通常不需要,但是部署HTML时或用细小的改变重新生成输入时可能是有用的(属性之间保留空格,等等)。

handle_starttag(tag,attrs)

该方法被用来处理一个标记的开始。计划通过一个导出类重载;这个基类什么也不实现。

tag参数是转换成小写字母的标记的名称。attrs参数是成对的(name,value)列表,包括发现在标记的<>中的属性。name将被转换成小些字母,并且在value中双引号和反斜线都已经被解释。例如,标记<AHREF=http://www.cwi.nl>,如同调用“handle_starttag(‘a’,[(‘href’,’http://www.cwi.nl’)])”。

handle_startendtag(tag,attrs)

类似于handle_starttat(),但是当解析器遇到一个XHTML风格的空标签(<a…/>)时调用。该方法通过子类可以被重载,子类需要这个特殊的词汇信息;缺省的实现是简单的调用handle_starttag()和handle_endtag()。

handle_endtag(tag)

该方法被用来处理元素的结束标记。它被计划通过一个导出类重载;该基类未实现任何事情。tag参数是该标记转换成小写字母的名称。

handle_data(data)

该方法用来处理任意数据。计划通过一个导出类被重载;该基类什么都不做。

handle_charref(name)

该方法用来处理”&#ref;”格式的字符引用。计划通过一个导出类被重载;该基类什么都不做。

handle_entityref(name)

该方法用来处理”&name;”格式的实体引用,name通常是一个普通的实体引用。计划通过一个导出类被重载;该基类什么都不做。

handle_comment(data)

当遇到注释时该方法被调用。comment参数是一个包含”--”和”--”定义符之间文本的字符串,但是不包括定义符本身。例如注释”<!—text-->”将促使该方法使用参数’text’被调用。计划通过一个导出类被重载;该基类什么都不做。

handle_decl(decl)

当解析器读取一个SGML声明时该方法被调用。decl参数将是<!...>标记中声明的全部内容。计划通过一个导出类被重载;该基类什么都不做。

handle_pi(data)

当遇到一个处理指令时调用该方法。data参数包含全部处理指令。例如,处理指令<?proccolor=’red’>,该方法作为handle_pi(“proccolor=’red’”)被调用。。计划通过一个导出类被重载;该基类什么都不做。

注意:HTMLParser类使用SGML语法规则处理指令。XHTML指令使用”?”结尾将导致”?”被包含在data中。

fromHTMLParserimportHTMLParser

classMyHTMLParser(HTMLParser):

def__init__(self):

HTMLParser.__init__(self)

self.links=[]

defhandle_starttag(self,tag,attrs):

#print"Encounteredthebeginningofa%stag"%tag

iftag=="a":

iflen(attrs)==0:pass

else:

for(variable,value)inattrs:

ifvariable=="href":

self.links.append(value)

if__name__=="__main__":

html_code="""

<ahref="www.google.com">google.com</a>

"""

hp=MyHTMLParser()

hp.feed(html_code)

hp.close()

print(hp.links)

输出为:

['www.google.com']

如果想抽取图形链接

<imgsrc='http://www.google.com/intl/zh-CN_ALL/images/logo.gif'/>

就要重定义handle_startendtag(tag,attrs)函数

相关推荐