sgmllib.py 包含一个重要的类: SGMLParser。SGMLParser 将 HTML 分解成有用的片段, 比如开始标记和结束标记。一旦它成功地分解出某个数据为一个有用的片段,它会根据 所发现的数据,调用一个自身内部的方法。为了使用这个分析器,您需要子类化 SGML- Parser类,并且覆盖这些方法。

SGMLParser类里面包含了很多内部方法,开始读取html后,遇到相应的数据就会调用其对应的方法,最重要的方法有三个:

start_tagname(self, attrs) 
end_tagname(self) 
handle_data(self, text) 
tagname就是标签名称,比如当遇到<pre>,就会调用start_pre,遇到</pre>,就会调用 end_pre,attrs即为标签的参数,以[(attribute, value), (attribute, value), ...]的形式传回,我们要做的就是在其子类重载自己感兴趣标签对应的函数。

一个经典的例子:

  1. from sgmllib import SGMLParser
  2. class URLLister(SGMLParser):
  3. self.urls = []
  4. def start_a(self, attrs):
  5. href = [v for k, v in attrs if k=='href']
  6. if href:
  7. self.urls.extend(href)

顾名思义,这个类的作用就是把html中的所有连接(<a>标签)中的地址(href属性的值)提取出来,放到一个list里面,很实用的功能。^^

比如处理下面的html:

  1. <tr>
  2. <td height="207" colspan="2" align="left" valign="top" class="normal">
  3. <p>Damien Rice - 《0》 </p>
  4. <a href="http://galeki.xy568.net/music/Delicate.mp3">1. Delicate</a><br />
  5. <a href="http://galeki.xy568.net/music/Volcano.mp3">2. Volcano</a><br />
  6. <a href="http://galeki.xy568.net/music/The Blower's Daughter.mp3">3. The Blower's Daughter</a><br />
  7. <a href="http://galeki.xy568.net/music/Cannonball.mp3">4. Cannonball </a><br />
  8. <a href="http://galeki.xy568.net/music/Older Chests.mp3">5. Order Chests</a><br />
  9. <a href="http://galeki.xy568.net/music/Amie.mp3">6. Amie</a><br />
  10. <a href="http://galeki.xy568.net/music/Cheers Darlin'.mp3">7. Cheers Darling</a><br />
  11. <a href="http://galeki.xy568.net/music/Cold Water.mp3">8. Cold water</a><br />
  12. <a href="http://galeki.xy568.net/music/I Remember.mp3">9. I remember</a><br />
  13. <a href="http://galeki.xy568.net/music/Eskimo.mp3">10. Eskimo</a></p>
  14. </td>
  15. </tr>

很乱对吧?下面让举个例子利用URLLister提取出上面mp3下载的地址:

date="上面那一堆…………" 
lister=URLLister() 
lister.feed(date) 
用feed()把要处理的html传递给对象实体,然后我们来看看处理结果:

print lister.urls 
显示:

['http://galeki.xy568.net/music/Delicate.mp3', 
'http://galeki.xy568.net/music/Volcano.mp3', 
"http://galeki.xy568.net/music/The Blower's Daughter.mp3", 
'http://galeki.xy568.net/music/Cannonball.mp3', 
'http://galeki.xy568.net/music/Older Chests.mp3', 
'http://galeki.xy568.net/music/Amie.mp3', 
"http://galeki.xy568.net/music/Cheers Darlin'.mp3", 
'http://galeki.xy568.net/music/Cold Water.mp3', 
'http://galeki.xy568.net/music/I Remember.mp3', 
'http://galeki.xy568.net/music/Eskimo.mp3'] 
好了,是不是很方便?现在我们知道了如何处理标签中的属性,那么如何处理标签包含的文字呢?就是上面列出的handle_data(self, text),当遇到标签内的内容,就会调用这个函数,传入的text自然就是标签内的内容了,不过,如何筛选出感兴趣标签内的内容呢?比如上面歌曲的列 表,这时候就要配合start_tagname、end_tagname,用做标记的方法来达到这个目的:

  1. class ListName(SGMLParser):
  2. is_a=""
  3. name=[]
  4. def start_a(self, attrs):
  5. self.is_a=1
  6. def end_a(self):
  7. self.is_a=""
  8. def handle_data(self, text):
  9. if self.is_a:
  10. self.name.append(text)

这里添加了一个is_a标记,再在handle_date中添加一个if,也就是说,仅仅在a标签内,才会把标签里的内容加到name[]里去。

看看结果:

  1. listname=ListName()
  2. listname.feed(date)
  3. print listname.name

显示:

['1.Delicate', '2.Volcano', "3.The Blower's Daughter", 
'4.Cannonball ', '5.Order Chests', '6.Amie', 
'7.Cheers Darling', '8.Cold water', '9.I remember', 
'10.Eskimo'] 
OK,搞定~

SGMLParser内置的方法不仅仅只有这三个,还有处理注释的handle_comment,还有处理声明的handle_decl等等等等,不过使用方法和上面的基本相同,不再多写了。

用python解析html--SGMLParser的更多相关文章

  1. 使用Python解析JSON数据

    使用Python解析百度API返回的JSON格式的数据 # coding:utf-8 # !/usr/bin/env python import matplotlib.pyplot as plt fr ...

  2. 使用Python解析JSON数据的基本方法

    这篇文章主要介绍了使用Python解析JSON数据的基本方法,是Python入门学习中的基础知识,需要的朋友可以参考下:     ----------------------------------- ...

  3. python解析robot framework的output.xml,并生成html

    一.背景 Jenkins自动构建RF脚本,生成的RF特有HTML报告不能正常打开. 需求:用Python解析测试报告的xml数据,放在普通HTML文件中打开 二.output.xml数据 三.用pyh ...

  4. python 解析json loads dumps

    认识 引用模块 重要函数 案例 排序 缩进参数 压缩 参考 认识 JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.它基于JavaScript(Standa ...

  5. Python解析器源码加密系列之(二):一次使用标准c的FILE*访问内存块的尝试

    摘要:由于近期打算修改Python解释器以实现pyc文件的加密/解密,出于保密的要求,解密之后的数据只能放在内存中,不能写入到文件中.但是后续的解析pyc文件的代码又只能接受FILE*作为入参,所以就 ...

  6. python 解析XML python模块xml.dom解析xml实例代码

    分享下python中使用模块xml.dom解析xml文件的实例代码,学习下python解析xml文件的方法. 原文转自:http://www.jbxue.com/article/16587.html ...

  7. python解析xml模块封装代码

    在python中解析xml文件的模块用法,以及对模块封装的方法.原文转自:http://www.jbxue.com/article/16586.html 有如下的xml文件:<?xml vers ...

  8. python解析xml之lxml

    虽然python解析xml的库很多,但是,由于lxml在底层是用C语言实现的,所以lxml在速度上有明显优势.除了速度上的优势,lxml在使用方面,易用性也非常好.这里将以下面的xml数据为例,介绍l ...

  9. Python解析生成XML-ElementTree VS minidom

    OS:Windows 7 关键字:Python3.4,XML,ElementTree,minidom 本文介绍用Python解析生成以下XML: <Persons> <Person& ...

  10. python解析xml

    python解析xml import xml.dom.minidom as minidom dom = minidom.parse("aa.xml") root = dom.get ...

随机推荐

  1. OkDownload项目实战

    本文介绍项目中引入okhttp-okgo开源框架里的OkDownload部分,实现了RecyclerView列表的下载功能. 引入OKDownload 需求不仅是要支持断点续传,而且还要支持队列下载和 ...

  2. python中的socket服务器(多线程)

    最近在写一个客户端和服务器的项目,使用了SocketServer模块,网上大多数都是TCP连接的例子,我在这总结一个UDP. 直接贴上代码 import threadingimport SocketS ...

  3. 算法笔记_107:蓝桥杯练习 算法提高 学霸的迷宫(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 问题描述 学霸抢走了大家的作业,班长为了帮同学们找回作业,决定去找学霸决斗.但学霸为了不要别人打扰,住在一个城堡里,城堡外面是一个二维的格子迷宫,要 ...

  4. 浅谈Volatile与多线程

        标题:浅谈Volatile与多线程 2011-04-19 22:49:17 最近看的比较杂,摘了一些人的笔记!随着多核的日益普及,越来越多的程序将通过多线程并行化的方式来提升性能.然而,编写正 ...

  5. Arrays.sort()

    今天在做一个按更新时间搜寻出某个目录里面的全部文件,因为自己写算法比較花费时间,干脆就用j2se提供的类Arrays提供的sort()方法,这样就比較省力.对于基本数据类型仅仅要Arrays.sort ...

  6. Python-代码对象

    可调用的对象是python执行环境中最重要的部分,python语句,赋值,表达式,模块等,这些 对象只是构成可执行代码块的拼图的很少的一部分,而这些代码块被称为代码对象.   每个可调用的对象的核心都 ...

  7. C# 操作ini配置文件

    最近使用Winform做一个小系统,由于需要保存一些默认配置项.自然就想到了轻量级的配置文件类型ini.在此也分享和记录一下实现方式,方便以后查询和使用. 废话不多说上代码: 实现公共函数↓ publ ...

  8. Android中Context的总结及其用法

    在android中我们经常遇到这样的情况,在创建一个对象的时候往往需要传递一个this参数,比如:语句 MyView mView = new MyView(this),要求传递一个this参数,这个t ...

  9. 5V转3.3v电路

    方案一: MIC5205-3.3 输出电流150ma 输出电压3.3V 其中:CT24为钽电容: 方案二: AMS1117-3.3 输出电流800ma 输出电压:3.3V 输入电压:4.75~12v

  10. winfrom更新

    原理: 工具生成更新配置节xml放到文件服务器上,外网可访问: 能过本地配置文件与服务器配置文件日期属性对比及配置节版本与大小属性判断有无更新: 存在更新,将文件从服务器下载到客户端,并替换原程序重启 ...