python中,有三个库可以解析html文本,HTMLParser,sgmllib,htmllib。他们的实现方法不通,但功能差不多。这三个库中 提供解析html的类都是基类,本身并不做具体的工作。他们在发现的元件后(如标签、注释、声名等),会调用相应的函数,这些函数必须重载,因为基类中不 作处理。

比如:

"""

Advice

The IETF admonishes:

Be strict in what you send.

"""

如果对这个数据做处理,当检测到标签时,对于HTMLParser,会调用handle_starttag函数。

下面具体介绍下几个库

1、HTMLParser

#------------------ HTMLParser_stack.py ------------------#

#-- coding: GBK --

import HTMLParser,sys,os,string

html = """

Advice

The IETF admonishes:

Be strict in what you send.

"""

tagstack = []

class ShowStructure(HTMLParser.HTMLParser):

def handle_starttag(self, tag, attrs): tagstack.append(tag)

def handle_endtag(self, tag): tagstack.pop()

def handle_data(self, data):

if data.strip():

for tag in tagstack: sys.stdout.write('/'+tag)

sys.stdout.write(' >> %s/n' % data[:40].strip())

ShowStructure().feed(html)

此函数的输出:

/html/body/p >> The

/html/body/p/a >> IETF admonishes:

/html/body/p/a/i >> Be strict in what you

/html/body/p/a/i/b >> send

/html/body/p/a/i >> .

对于一些网页,可能并没有严格的开始结束标签对,这时,我们可以去忽略一些标签。可以自己写个堆栈来处理这些标签。

#*--------------- TagStack class example -----------------#

class TagStack:

def __init__(self, lst=[]): self.lst = lst

def __getitem__(self, pos): return self.lst[pos]

def append(self, tag):

# Remove every paragraph-level tag if this is one

if tag.lower() in ('p','blockquote'):

self.lst = [t for t in self.lst

if t not in ('p','blockquote')]

self.lst.append(tag)

def pop(self, tag):

# "Pop" by tag from nearest pos, not only last item

self.lst.reverse()

try:

pos = self.lst.index(tag)

except ValueError:

raise HTMLParser.HTMLParseError, "Tag not on stack"

del self.lst[pos]

self.lst.reverse()

tagstack = TagStack()

HTMLParser有个bug,就是不能处理中文属性,比如说,如果网页里有这么一段:

那么解析到这一行时就会出错。

错误原因还是正则表达式惹的祸。

attrfind = re.compile(

r'/s*([a-zA-Z_][-.:a-zA-Z_0-9]*)(/s*=/s*'

r'(/'[^/']*/'|"[^"]*"|[-a-zA-Z0-9./,:;+*%?!&$/(/)_#=~@]*))?')

attrfind 没有匹配中文字符。

可以更改这个匹配已修正这个错误。sgmllib则不存在这种错误。

2、sgmllib

html格式为sgml格式的一个子集,所以sgml可以处理跟多的东西,下面通过一段代码来示例sgmllib的用法。

#------------------ HTMLParser_stack.py ------------------#

#-- coding: GBK --

import sgmllib,sys,os,string

html = """Advice

The IETF admonishes:

Be strict in what you send.

"""

os.chdir('d://python')

f=file('testboard.txt','r')

contest=f.read()

tagstack = []

class ShowStructure(sgmllib.SGMLParser):

def handle_starttag(self, tag, method,attrs): tagstack.append(tag)

def handle_endtag(self, tag): tagstack.pop()

def handle_data(self, data):

if data.strip():

for tag in tagstack: sys.stdout.write('/'+tag)

sys.stdout.write(' >> %s/n' % data[:40].strip())

def unknown_starttag(self,tag,attrs):

print 'start tag:'

def unknown_endtag(self,tag):

print 'end tag:'+tag+'>'

def start_lala(self,attr):

print 'lala tag found'

ShowStructure().feed(html)

输出:

start tag:

start tag:

/lala >> Advice

end tag:

end tag:

start tag:

start tag:

/lala >> The

start tag:

/lala >> IETF admonishes:

start tag:

/lala >> Be strict in what you

start tag:

/lala >> send

end tag:

/lala >> .

end tag:

end tag:

end tag:

start tag:

start tag:

/lala >> ϒ

start tag:

end tag:

end tag:

end tag:

和HTMLParser一样,如果要用sgmllib解析html,则要继承sgmllib.SGMLParser类,此类里的函数都是空的,用户需要重载它。这个类提供的功能是在特定情况下调用相应的函数。

比如当发现标签时,如果并没有定义 start_html(self,attr)函数,则会调用unknown_starttag函数,具体怎么处理则更具用户。

sgml的标签是可以自定义的,比如自己定义了一个start_lala函数,则就会处理标签。

个地方要说明下,如果定义了start_tagname函数,有定义了handle_starttag函数,则函数只会运行

handle_starttag函数,start_tagname为空函数都没有问题,如果没有定义handle_starttag函数,则遇

到标签时,会运行start_tagname函数。如果没有定义tagname的start函数,则此标签为未知标签,调

用unknown_starttag函数

python解析html的库_用python解析html相关推荐

  1. python批量安装第三方库_使用Python批量安装第三方库

    Python的很多功能通过第三方库实现,99%的第三方库可以通过Python自带的pip方法进行自动下载和安装.然而Python有几十万个第三方库,最常用的也有几十个.想要一次性地安装几十个常用的第三 ...

  2. python判断题题库_《Python程序设计》判断题1-240题

    1.Python是一种跨平台.开源.免费的高级动态编程语言.(对) 2.Python 3.x完全兼容Python 2.x.(错) 3.Python 3.x和Python 2.x唯一的区别就是:prin ...

  3. python需要安装的库_使用python学习【机器学习】需要安装的库~

    ---------------------------------------------------------------------------------------------------- ...

  4. python画图表的库_「Python」python绘制图表

    介绍一种简单而又功能强大的绘制图形或报表的包-pyecharts,一个基于Echarts(基于JS的数据可视化库)的图标类库,除了绘制常见的折线图.柱状图.饼图.箱型图和散点图外,还可以绘制3D柱状图 ...

  5. python处理时间的标准函数库_使用Python的datetime库处理时间(RPA流程)

    RPA流程自动化过程中,遇到时间的相关操作时,可以调用datetime库的一些方法进行处理. datetime 是 Python 处理日期和时间的标准库. 1.获取当前日期和时间 我们先看如何获取当前 ...

  6. python加载动态库_使用Python调用动态库

    我个人在日常使用电脑时,经常需要使用Google,于是就要切换代理,基本上是一会儿切换为代理,一会儿切换成直连,老是打开internet 选项去设置,很不方便,于是我萌生了一个想法: 做一个开关,我想 ...

  7. python安装poi第三方库_使用Python获取城市POI数据

    1.数据接口: 本次使用百度地图开放平台中的地点检索API来获取城市POI数据,此次以矩形区域检索为例. 2.获取思路: 因为百度出于数据保护目的,单次访问服务最多同时返回400条数据,不过官方也给出 ...

  8. python 句子相似度 库_利用python语句的word2vec查找两个句子之间的相似度

    我想用word2vectors计算两个句子之间的相似度,我试图得到一个句子向量的向量,这样我就可以计算出一个句子向量的平均值来找到余弦相似度.我试过这个代码,但它不起作用.它给出的输出是带有一的句子向 ...

  9. python xmind库_用Python解析XMind

    本文来自网易云社区 作者:孙圣翔 XMind是画思维脑图很好的工具,正好组里有个需要,是要将xmind画的状态图,转化成代码. 而用来解析xmind的库有个python的,还是官方出品的.不过真不愧是 ...

最新文章

  1. 2019年1月29日
  2. 2020\Simulation_1\7.音节判断
  3. linux的底层文件i o,Linux 文件I/O操作
  4. 获取客户端浏览器信息
  5. Android之在ubuntu上常用的am、pm命令的总结
  6. C语言中的“三字母词”坑了工程师
  7. 让VC编译的程序链接到系统的 msvcrt.dll 的方法
  8. java栈的底层实现_JVM 底层原理总结
  9. AchartEngine的柱状图属性设置
  10. 正则表达式之非捕获组
  11. hightcharts 3d 堆积图下钻
  12. Citrix为什么要兼容第三方服务器虚拟化平台
  13. android 手机主题制作,怎么制作手机主题?
  14. python合并大量ts文件_Python爬取网站m3u8视频,将ts解密成mp4,合并成整体视频
  15. php项目收银系统,(三)设计模式之PHP项目应用(策略模式:商场收银系统)
  16. SpringCloud(8)— 使用ElasticSearch(RestClient)
  17. 正经分析iOS包大小优化
  18. 思科计算机考试期末,Cisco期末考试选择题题库.doc
  19. 微信小程序实现腾讯地图定位功能-demo
  20. NLP:自然语言处理技术近十年发展技术更迭的简介、案例之详细攻略(持续更新)daiding待更新

热门文章

  1. 面向对象chapter1
  2. AJAX中的跨域问题:什么是跨域?如何解决跨域问题?
  3. 硬盘主分区和拓展分区
  4. XP Embedded:不同的用户使用不同的外壳程序
  5. ASP.NET中使用非托管DLL
  6. [Linux][Ubuntu]Linux实习常用操作/Debug总结
  7. CodeForces 895 B. XK Segments 二分查找
  8. 自己的路 php,生活感悟的句子:走自己的路,做自己的事
  9. android glide 版本,Android Studio 第六十七期 - Android Glide3.7.0和3.8.0用法
  10. python 文件状态_Python:如何访问文件的状态