python的HTMLParser

urllib和HTMLParse两个库

urllib可以将网页爬下来

HTMLParser可以解析网页

HTMLParser主要有以下几个以handle_开头的函数,在写自己的类的时候需要一般会重载这几个函数:

handle_startendtag:处理开始标签和结束标签

handle_starttag:处理开始标签

handle_endtag:处理结束标签

handle_charref 处理特殊字符串,就是以&#开头的,一般是内码表示的字符

handle_entituref 处理一些特殊字符,已&开头的,比如&nbsp

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)




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值