用python解析html[SGMLParser]

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
简介:

因为要用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,如需转载请自行联系原作者

相关文章
|
1天前
|
存储 索引 Python
Python入门:6.深入解析Python中的序列
在 Python 中,**序列**是一种有序的数据结构,广泛应用于数据存储、操作和处理。序列的一个显著特点是支持通过**索引**访问数据。常见的序列类型包括字符串(`str`)、列表(`list`)和元组(`tuple`)。这些序列各有特点,既可以存储简单的字符,也可以存储复杂的对象。 为了帮助初学者掌握 Python 中的序列操作,本文将围绕**字符串**、**列表**和**元组**这三种序列类型,详细介绍其定义、常用方法和具体示例。
Python入门:6.深入解析Python中的序列
|
1天前
|
存储 Linux iOS开发
Python入门:2.注释与变量的全面解析
在学习Python编程的过程中,注释和变量是必须掌握的两个基础概念。注释帮助我们理解代码的意图,而变量则是用于存储和操作数据的核心工具。熟练掌握这两者,不仅能提高代码的可读性和维护性,还能为后续学习复杂编程概念打下坚实的基础。
Python入门:2.注释与变量的全面解析
|
7天前
|
监控 算法 安全
内网桌面监控软件深度解析:基于 Python 实现的 K-Means 算法研究
内网桌面监控软件通过实时监测员工操作,保障企业信息安全并提升效率。本文深入探讨K-Means聚类算法在该软件中的应用,解析其原理与实现。K-Means通过迭代更新簇中心,将数据划分为K个簇类,适用于行为分析、异常检测、资源优化及安全威胁识别等场景。文中提供了Python代码示例,展示如何实现K-Means算法,并模拟内网监控数据进行聚类分析。
28 10
|
8天前
|
数据采集 前端开发 API
SurfGen爬虫:解析HTML与提取关键数据
SurfGen爬虫:解析HTML与提取关键数据
|
25天前
|
存储 算法 安全
控制局域网上网软件之 Python 字典树算法解析
控制局域网上网软件在现代网络管理中至关重要,用于控制设备的上网行为和访问权限。本文聚焦于字典树(Trie Tree)算法的应用,详细阐述其原理、优势及实现。通过字典树,软件能高效进行关键词匹配和过滤,提升系统性能。文中还提供了Python代码示例,展示了字典树在网址过滤和关键词屏蔽中的具体应用,为局域网的安全和管理提供有力支持。
50 17
|
28天前
|
运维 Shell 数据库
Python执行Shell命令并获取结果:深入解析与实战
通过以上内容,开发者可以在实际项目中灵活应用Python执行Shell命令,实现各种自动化任务,提高开发和运维效率。
56 20
|
3月前
|
XML 数据采集 数据格式
Python 爬虫必备杀器,xpath 解析 HTML
【11月更文挑战第17天】XPath 是一种用于在 XML 和 HTML 文档中定位节点的语言,通过路径表达式选取节点或节点集。它不仅适用于 XML,也广泛应用于 HTML 解析。基本语法包括标签名、属性、层级关系等的选择,如 `//p` 选择所有段落标签,`//a[@href=&#39;example.com&#39;]` 选择特定链接。在 Python 中,常用 lxml 库结合 XPath 进行网页数据抓取,支持高效解析与复杂信息提取。高级技巧涵盖轴的使用和函数应用,如 `contains()` 用于模糊匹配。
|
7月前
|
数据挖掘 Shell 测试技术
怎么用Python解析HTML轻松搞定网页数据
**Python解析HTML摘要** 本文介绍了使用Python处理HTML的常见需求,如数据提取、网络爬虫和分析,并讨论了三种解析方法。正则表达式适用于简单匹配,但对复杂HTML不理想;BeautifulSoup提供简单API,适合多数情况;lxml结合XPath,适合处理大型复杂文档。示例展示了如何用这些方法提取链接。
280 2
|
7月前
|
Unix Linux Shell
Sphinx是一个Python文档生成工具,它可以解析reStructuredText或Markdown格式的源代码注释,并生成多种输出格式,如HTML、LaTeX、PDF、ePub等。
Sphinx是一个Python文档生成工具,它可以解析reStructuredText或Markdown格式的源代码注释,并生成多种输出格式,如HTML、LaTeX、PDF、ePub等。
|
数据采集 XML 前端开发
Python爬虫:scrapy内置网页解析库parsel-通过css和xpath解析xml、html
Python爬虫:scrapy内置网页解析库parsel-通过css和xpath解析xml、html
240 0

热门文章

最新文章

推荐镜像

更多