Chinaunix首页 | 论坛 | 博客
  • 博客访问: 303128
  • 博文数量: 34
  • 博客积分: 2375
  • 博客等级: 大尉
  • 技术积分: 354
  • 用 户 组: 普通用户
  • 注册时间: 2006-01-09 05:49
文章存档

2013年(1)

2012年(3)

2011年(10)

2010年(20)

我的朋友

分类: Python/Ruby

2010-06-19 22:00:16

该模块定义一个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中双引号和反斜线都已经被解释。例如,标记如同调用“handle_starttag(a,[(href,)])”。

handle_startendtag(tag, attrs)
类似于handle_starttat(),但是当解析器遇到一个XHTML风格的空标签(/>)时调用。该方法通过子类可以被重载,子类需要这个特殊的词汇信息;缺省的实现是简单的调用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参数包含全部处理指令。例如,处理指令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 = """
    .
google.com"> google.com
    .
pythonclub.org"> PythonClub
    .sina.com.cn"> Sina
    """
    hp = MyHTMLParser()
    hp.feed(html_code)
    hp.close()
    print(hp.links)

 

输出为: 

['', '', '']


如果想抽取图形链接

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


阅读(2392) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~