用python解析html--SGMLParser
来源:互联网 发布:金林钣金软件手机版 编辑:程序博客网 时间:2024/05/16 09:37
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), ...]的形式传回,我们要做的就是在其子类重载自己感兴趣标签对应的函数。
一个经典的例子:
- from sgmllib import SGMLParser
- class URLLister(SGMLParser):
- self.urls = []
- def start_a(self, attrs):
- href = [v for k, v in attrs if k=='href']
- if href:
- self.urls.extend(href)
顾名思义,这个类的作用就是把html中的所有连接(<a>标签)中的地址(href属性的值)提取出来,放到一个list里面,很实用的功能。^^
比如处理下面的html:
- <tr>
- <td height="207" colspan="2" align="left" valign="top" class="normal">
- <p>Damien Rice - 《0》 </p>
- <a href="http://galeki.xy568.net/music/Delicate.mp3">1. Delicate</a><br />
- <a href="http://galeki.xy568.net/music/Volcano.mp3">2. Volcano</a><br />
- <a href="http://galeki.xy568.net/music/The Blower's Daughter.mp3">3. The Blower's Daughter</a><br />
- <a href="http://galeki.xy568.net/music/Cannonball.mp3">4. Cannonball </a><br />
- <a href="http://galeki.xy568.net/music/Older Chests.mp3">5. Order Chests</a><br />
- <a href="http://galeki.xy568.net/music/Amie.mp3">6. Amie</a><br />
- <a href="http://galeki.xy568.net/music/Cheers Darlin'.mp3">7. Cheers Darling</a><br />
- <a href="http://galeki.xy568.net/music/Cold Water.mp3">8. Cold water</a><br />
- <a href="http://galeki.xy568.net/music/I Remember.mp3">9. I remember</a><br />
- <a href="http://galeki.xy568.net/music/Eskimo.mp3">10. Eskimo</a></p>
- </td>
- </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,用做标记的方法来达到这个目的:
- class ListName(SGMLParser):
- is_a=""
- name=[]
- def start_a(self, attrs):
- self.is_a=1
- def end_a(self):
- self.is_a=""
- def handle_data(self, text):
- if self.is_a:
- self.name.append(text)
这里添加了一个is_a标记,再在handle_date中添加一个if,也就是说,仅仅在a标签内,才会把标签里的内容加到name[]里去。
看看结果:
- listname=ListName()
- listname.feed(date)
- 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等等等等,不过使用方法和上面的基本相同,不再多写了。
0 0
- 用python解析html[SGMLParser]
- 用python解析html--SGMLParser
- python:解析html(HTMLParser、SGMLParser)
- python:解析html(HTMLParser、SGMLParser)
- 解析html的python库--SGMLParser
- 解析 HTML -- SGMLParser
- #小练习 SGMLParser 解析 HTML
- python网页解析之SGMLParser
- python学习笔记三:解析html(HTMLParser、SGMLParser),并抓取图片
- Python SGMLParser简介
- Python爬虫--SGMLParser
- 用python解析html
- 用python解析html
- 用python解析html
- 用python解析html
- python sgmllib.SGMLParser的学习
- SGMLParser
- SGMLParser
- http常见错误号
- 全新来客码智能纳客营销系统免费使用功能效果
- 【转载】PCA降维数学原理
- Unity3D游戏开发之Lua与游戏的不解之缘(转载1)
- 如何写好Java的单例
- 用python解析html--SGMLParser
- 上线项目更新版本后如何避免客户端js和css缓存
- Angular源码解读之Render
- 快速排序步骤
- HAUT 1262 魔法宝石(spfa)(河南工业大学2017校赛)
- 免费而优秀的图表JS插件
- 欧拉角RPY对应XYZ轴
- Plug-in 创建SWT项目
- 一探Android嵌套滑动 NestedScrolling