文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>解析html之HTMLParser模块

解析html之HTMLParser模块

时间:2010-06-19  来源:GOD_Father

该模块定义一个HTMLParser类,解析HTML(超文本标记语言)和XHTML中的文本格式的文件。不同于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>
    <A Href="www.pythonclub.org"> PythonClub </a>
    <A HREF = "www.sina.com.cn"> Sina </a>
    """
    hp = MyHTMLParser()
    hp.feed(html_code)
    hp.close()
    print(hp.links)

 

输出为: 

['www.google.com', 'www.pythonclub.org', 'www.sina.com.cn']


如果想抽取图形链接

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

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


相关阅读 更多 +
排行榜 更多 +
找茬脑洞的世界安卓版

找茬脑洞的世界安卓版

休闲益智 下载
滑板英雄跑酷2手游

滑板英雄跑酷2手游

休闲益智 下载
披萨对对看下载

披萨对对看下载

休闲益智 下载