HTMLParser
该模块定义一个HTMLParser类,解析HTML(超文本标记语言)和HTML中的文本格式的文件。不同于htmllib中的解析器,该解析器不基于sgmllib中的SGML解析器。
class HTMLParser()
HTMLParser类的实例化不需要参数。
当标记开始和结束时,HTMLParser实例被HTML数据使用,同时调用处理函数。HTMLParser类由用户提供一个期望的行为时,意味着被重载。
不同于htmllib中的解析器,这个解析器不检查结尾的标记是否匹配开始的标记,或为通过关闭一个外部元素隐式关闭的元素调用结束标记处理器。
也定义一个异常:
exception HTMLParseError
当解析遇到一个错误时,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中双引号和反斜线都已经被解释。例如,标记<A HREF=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参数包含全部处理指令。例如,处理指令<?proc color=’red’>,该方法作为handle_pi(“proc color=’red’”)被调用。。计划通过一个导出类被重载;该基类什么都不做。
注意:HTMLParser类使用SGML语法规则处理指令。XHTML指令使用”?”结尾将导致”?”被包含在data中。
from HTMLParser import HTMLParser
?
class MyHTMLParser(HTMLParser):
??? def __init__(self):
??????? HTMLParser.__init__(self)
??????? self.links = []
?
??? def handle_starttag(self, tag, attrs):
??????? #print "Encountered the beginning of a %s tag" % tag
??????? if tag == "a":
??????????? if len(attrs) == 0: pass
??????????? else:
??????????????? for (variable, value)? in attrs:
??????????????????? if variable == "href":
??????????????????????? self.links.append(value)
?
if __name__ == "__main__":
??? html_code = """
??? <a href="www.google.com"> google.com</a>
??? """
??? hp = MyHTMLParser()
??? hp.feed(html_code)
??? hp.close()
??? print(hp.links)
输出为:
??? ['www.google.com']
如果想抽取图形链接
??? <img src='http://www.google.com/intl/zh-CN_ALL/images/logo.gif' />
就要重定义 handle_startendtag( tag, attrs) 函数