您的位置:首页 > 编程语言 > Python开发

python sgmllib.SGMLParser的学习

2013-12-18 16:42 239 查看
#!/usr/bin/python

#coding:utf-8

import urllib,time

#导入sgmllib中分析网页的 SGMLParser模块

from sgmllib import SGMLParser

#SGMLParser模块的介绍

"""

1.为了从 HTML 文档中提取数据,将 SGMLParser 类进行子类化,然后对想要捕捉的标记或实体定义方法

2.reset 由 SGMLParser 的 __init__ 方法来调用,也可以在创建一个分析器实例时手工来调用。所以如

果您需要做初始化,在 reset 中去做,而不要在 __init__ 中做。这样当某人重用一个分析器实例时,

可以正确地重新初始化。

3.只要找到一个 <a> 标记,start_a 就会由 SGMLParser 进行调用。这个标记可以包含一个 href 属性,

或者包含其它的属性,如 name 或 title。attrs 参数是一个 tuple 的 list,[(attribute, value),

(attribute, value), ...]。或者它可以只是一个有效的 HTML 标记 <a> (尽管无用),这时 attrs 将

是个空 list。

4.我们可以通过一个简单的多变量 list 映射来查找这个 <a> 标记是否拥有一个 href 属性。

5.像 k=='href' 的字符串比较是区分大小写的,但是这里是安全的。因为 SGMLParser 会在创建 attrs

时将属性名转化为小写。

6.调用定义在 SGMLParser 中的 feed 方法,将 HTML 内容放入分析器中。 这个方法接收一个字符串。

7.像处理文件一样,一旦处理完毕,您应该 close 您的 URL 对象。

8.您也应该 close 您的分析器对象,但出于不同的原因。feed 方法不保证对传给它的全部HTML进行处理,

它可能会对其进行缓冲处理,等待接收更多的内容。只要没有更多的内容,就应调用 close 来刷新缓冲区,

并且强制所有内容被完全处理。

9.一旦分析器被 close,分析过程也就结束了。parser.urls 中包含了在 HTML 文档中所有的链接 URL。

"""

#urllib的简单介绍

"""

1.urllib 模块是标准 Python 库的一部分。它包含了一些函数,可以从基于互联网的 URL (主要指网页)

来获取信息并且真正取回数据。

2.urllib 模块最简单的使用是提取用 urlopen 函数取回的网页的整个文本。打开一个 URL 同打开一个

文件相似。urlopen 的返回值是像文件一样的对象,它具有一个文件对象一样的方法。

3.使用由 urlopen 所返回的类文件对象所能做的最简单的事情就是 read,它可以将网页的整个 HTML

读到一个字符串中。这个对象也支持 readlines 方法,这个方法可以将文本按行放入一个列表中。

4.当用完这个对象,要确保将它 close,就如同一个普通的文件对象

"""

class MySGMLParser(SGMLParser):
#重写SGMLParser模块中的reset函数,
def reset(self):
#调用原来的函数resert
SGMLParser.reset(self)
#数据存放的位置
self.data = []
self.lable = False
self.url = []

#查找的标签(start_ + 标签)表示查找的那个标签(参数是固定的)
def start_a(self,attrs):
#查找对象的标签里面的属性(此处用到了列表解析)
href = [v for k,v in attrs if k == 'href']
#判断href是不是存在
if href:
self.url.extend(href)
self.lable = True

#查找结束的标志
def end_a(self):
self.lable = False
#处理信息数据的地方
def handle_data(self,data):
#判断标签数不超找完毕
if self.lable:
data = data.strip()
self.data.append(data)

class ParserData():
def __init__(self,urlpath):
self.urlpath = urlpath
self.dealData()
print "##################"

print locals()
print "##################"
#读取url路径的
def readData(self):
data = None
#访问的地址是不是存在,不存在侧抛出异常
try:
data = urllib.urlopen(self.urlpath)
except IOError,e:
print u'地址不存在'
return data

#处理数据
def dealData(self):
#对上述的类实例化
parser = MySGMLParser()
#获取访问url的对象
data = self.readData()
if data != None:
#	调用定义在 SGMLParser 中的 feed 方法,将 HTML 内容放入分析器中(feed传值为字符串)
parser.feed(data.read())
self.closeData(data,parser,)
#遍历查找的数据
for i in parser.url:
if i.startswith('http'):
print 'url:',i

for i in parser.data:
print 'data:',unicode(i,'utf-8')

def closeData(self,data,parser):
parser.close()
data.close()

if __name__ == "__main__":
urlpath = 'http://www.baidu.com'
data = ParserData(urlpath)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: