用python解析html[SGMLParser]

简介:

因为要用python做学校网络的认证程序,需要解析服务器传回的html,本以为会像javascript里操作DOM那样简单,结果发现并不是 这样,被搞了一下。

其实python里面有xml.dom模块,但是这次却不能用,为啥呢?因为服务器传回的html从xml角度看不是良构的,没有闭合的标签、没有 被注释掉的javascript和css,xml.dom没法处理,这个时候要用sgmllib。

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 =  [for k, v  in attrs  if k== 'href' ] 
  6.          if href:
  7.              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下载的地址:

  1. date= "上面那一堆…………"
  2. lister=URLLister ( )
  3. lister. feed (date )

用feed()把要处理的html传递给对象实体,然后我们来看看处理结果:

  1. 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等等等等, 不过使用方法和上面的基本相同,不再多写了。




















本文转sinojelly51CTO博客,原文链接:http://blog.51cto.com/pnig0s1992/412049,如需转载请自行联系原作者

相关文章
|
27天前
|
存储 安全 测试技术
Python面试题精选及解析
本文详解Python面试中的六大道经典问题,涵盖列表与元组区别、深浅拷贝、`__new__`与`__init__`、GIL影响、协程原理及可变与不可变类型,助你提升逻辑思维与问题解决能力,全面备战Python技术面试。
|
29天前
|
数据采集 数据挖掘 测试技术
Go与Python爬虫实战对比:从开发效率到性能瓶颈的深度解析
本文对比了Python与Go在爬虫开发中的特点。Python凭借Scrapy等框架在开发效率和易用性上占优,适合快速开发与中小型项目;而Go凭借高并发和高性能优势,适用于大规模、长期运行的爬虫服务。文章通过代码示例和性能测试,分析了两者在并发能力、错误处理、部署维护等方面的差异,并探讨了未来融合发展的趋势。
111 0
|
2月前
|
JSON API 开发者
天猫商品详情API接口技术解析与Python实现
天猫商品详情API(tmall.item_get)通过商品ID获取商品标题、价格、库存、图片、SKU及评价等详细信息,支持HTTP请求与JSON格式返回,适用于电商数据分析与运营。本文提供Python调用示例,实现快速接入与数据解析。
|
2月前
|
数据采集 数据可视化 搜索推荐
Python数据分析全流程指南:从数据采集到可视化呈现的实战解析
在数字化转型中,数据分析成为企业决策核心,而Python凭借其强大生态和简洁语法成为首选工具。本文通过实战案例详解数据分析全流程,涵盖数据采集、清洗、探索、建模、可视化及自动化部署,帮助读者掌握从数据到业务价值的完整技能链。
293 0
|
2月前
|
XML 缓存 API
python语言深度解析易贝api接口
本文深入解析 eBay API 的 Python 实战应用,涵盖认证授权、核心接口调用、数据处理优化及高级电商场景实现,助你高效构建自动化电商系统。
|
22天前
|
安全 JavaScript Java
Python中None与NoneType的真相:从单例对象到类型系统的深度解析
本文通过10个真实场景,深入解析Python中表示“空值”的None与NoneType。从单例模式、函数返回值,到类型注解、性能优化,全面揭示None在语言设计与实际编程中的核心作用,帮助开发者正确高效地处理“无值”状态,写出更健壮、清晰的Python代码。
112 3
|
1月前
|
数据采集 存储 Web App开发
Python爬虫库性能与选型实战指南:从需求到落地的全链路解析
本文深入解析Python爬虫库的性能与选型策略,涵盖需求分析、技术评估与实战案例,助你构建高效稳定的数据采集系统。
210 0
|
28天前
|
存储 程序员 数据处理
Python列表基础操作全解析:从创建到灵活应用
本文深入浅出地讲解了Python列表的各类操作,从创建、增删改查到遍历与性能优化,内容详实且贴近实战,适合初学者快速掌握这一核心数据结构。
119 0
|
28天前
|
存储 小程序 索引
Python变量与基础数据类型:整型、浮点型和字符串操作全解析
在Python编程中,变量和数据类型是构建程序的基础。本文介绍了三种基本数据类型:整型(int)、浮点型(float)和字符串(str),以及它们在变量中的使用方式和常见操作。通过理解变量的动态特性、数据类型的转换与运算规则,初学者可以更高效地编写清晰、简洁的Python代码,为后续学习打下坚实基础。
168 0
|
29天前
|
并行计算 算法 Java
Python3解释器深度解析与实战教程:从源码到性能优化的全路径探索
Python解释器不止CPython,还包括PyPy、MicroPython、GraalVM等,各具特色,适用于不同场景。本文深入解析Python解释器的工作原理、内存管理机制、GIL限制及其优化策略,并介绍性能调优工具链及未来发展方向,助力开发者提升Python应用性能。
103 0

热门文章

最新文章

推荐镜像

更多