urllib和HTMLParse两个库
urllib可以将网页爬下来
HTMLParser可以解析网页
HTMLParser主要有以下几个以handle_开头的函数,在写自己的类的时候需要一般会重载这几个函数:
handle_startendtag:处理开始标签和结束标签
handle_starttag:处理开始标签
handle_endtag:处理结束标签
handle_charref 处理特殊字符串,就是以&#开头的,一般是内码表示的字符
handle_entituref 处理一些特殊字符,已&开头的,比如 
handle_data 处理数据
handle_comment 处理注释
handle_decl 处理<!开头的
handle_pi 处理形如<?instruction>的东西
HTMLParser调用的方法有两种,显式调用和不显式调用。
不需要显式调用的方法,如以上几种
需要显式调用的方法:
feed(data):参数为需要解析的html字符串,调用后字符串开始被解析
getpos() 返回当前的行号和偏移位置
get_starttag_text() 返回当前位置最近的开始标签的内容
示例1:基本函数的理解
#!/usr/bin/env python
# coding=utf-8
from HTMLParser import HTMLParser
class MyHTMLParser(HTMLParser):
def handle_starttag(self, tag, attrs):
print "a start tag:",tag,self.getpos()
parser=MyHTMLParser()
parser.feed('<div><p>"hello"</p></div>')
运行结果为:
a start tag: div (1, 0)
a start tag: p (1, 5)
示例2:
找到<a>标签
#-*- encoding: gb2312 -*-
import HTMLParser
class MyParser(HTMLParser.HTMLParser):
def __init__(self):
HTMLParser.HTMLParser.__init__(self)
def handle_starttag(self, tag, attrs):
# 这里重新定义了处理开始标签的函数
if tag == 'a':
# 判断标签<a>的属性
for name,value in attrs:
if name == 'href':
print value
if __name__ == '__main__':
a = '<html><head><title>test</title><body><a href="http://www.163.com">链接到163</a></body></html>'
my = MyParser()
# 传入要分析的数据,是html的。
my.feed(a)
输出结果为:
http://www.163.com
示例3:
抓取图片
# -*- coding:utf-8 -*-
# file: GetImage.py
#
import Tkinter
import urllib
import HTMLParser
class MyHTMLParser(HTMLParser.HTMLParser): # 创建HTML解析类
def __init__(self):
HTMLParser.HTMLParser.__init__(self)
self.gifs = [] # 创建列表,保存gif
self.jpgs = [] # 创建列表,保存jpg
def handle_starttag(self, tags, attrs): # 处理起始标记
if tags == 'img': # 处理图片
for attr in attrs:
for t in attr:
if 'gif' in t:
self.gifs.append(t) # 添加到gif列表
elif 'jpg' in t:
self.jpgs.append(t) # 添加到jpg列表
else:
pass
def get_gifs(self): # 返回gif列表
return self.gifs
def get_jpgs(self): # 返回jpg列表
return self.jpgs
class Window:
def __init__(self, root):
self.root = root # 创建组件
self.label = Tkinter.Label(root, text = '输入URL:')
self.label.place(x = 5, y = 15)
self.entryUrl = Tkinter.Entry(root,width = 30)
self.entryUrl.place(x = 65, y = 15)
self.get = Tkinter.Button(root, text = '获取图片', command = self.Get)
self.get.place(x = 280, y = 15)
self.edit = Tkinter.Text(root,width = 470,height = 600)
self.edit.place(y = 50)
def Get(self):
url = self.entryUrl.get() # 获取URL
page = urllib.urlopen(url) # 打开URL
data = page.read() # 读取URL内容
parser = MyHTMLParser() # 生成实例对象
parser.feed(data) # 处理HTML数据
self.edit.insert(Tkinter.END, '====GIF====\n') # 输出数据
gifs = parser.get_gifs()
for gif in gifs:
self.edit.insert(Tkinter.END, gif + '\n')
self.edit.insert(Tkinter.END, '===========\n')
self.edit.insert(Tkinter.END, '====JPG====\n')
jpgs = parser.get_jpgs()
for jpg in jpgs:
self.edit.insert(Tkinter.END, jpg + '\n')
self.edit.insert(Tkinter.END, '===========\n')
page.close()
root = Tkinter.Tk()
window = Window(root)
root.minsize(600,480)
root.mainloop()
结果为:
抓取的一般步骤为:
获取url get
打开url urlopen
读取url data = page.read()
生成Parser实例对象(自己定义的HTMLParser)
处理HTML数据 parser.feed(data)