Python中使用HTMLParser解析html实例
作者:junjie 发布时间:2023-01-17 11:47:16
前几天遇到一个问题,需要把网页中的一部分内容挑出来,于是找到了urllib和HTMLParser两个库.urllib可以将网页爬下来,然后交由HTMLParser解析,初次使用这个库,在查官方文档时也遇到了一些问题,在这里写下来与大家分享.
一个例子
from HTMLParser import HTMLParser
class MyHTMLParser(HTMLParser):
def handle_starttag(self, tag, attrs):
print "a start tag:",tag,self.getpos()
parser=MyHTMLParser()
parser.feed('<div><p>"hello"</p></div>')
这个例子里HTMLParser是基类,重载了他的handle_starttag方法,输出了一些信息.parser是MyHTMLParser的实例,调用feed方法开始解析函数.值得注意的是,不需要显示调用handle_starttag方法就会执行.
HTMLParser方法的调用方式困惑了我很长时间,看了很多博文才恍然大悟,HTMLParser含有的方法分为两类,一类是需要显式调用的,而另一类不需显示调用.
不需显式调用的方法
下面的这些函数在解析的过程中会触发,但是默认情况下不会产生任何副作用,因而我们要根据自己的需求重载.
1.HTMLParser.handle_starttag(tag,attrs): 解析时遇到开始标签调用,如<p class='para'>,参数tag是标签名,这里是'p',attrs为标签所有属性(name,value)列表,这里是[('class','para')]
2.HTMLParser.handle_endtag(tag): 遇到结束标签时调用,tag是标签名
3.HTMLPars.handle_data(data): 遇到标签中间的内容时调用,如<style> p {color: blue; }</style>,参数data为开闭标签间的内容.值得注意的是在形如<div><p>...</p></div>的位置,并不会在div处调用,而是只在p处调用
当然还有其他函数,这里不做介绍
显式调用的方法
1.HTMLParser.feed(data): 参数为需要解析的html字符串,调用后字符串开始被解析
2.HTMLParser.getpos(): 返回当前的行号和偏移位置,如(23,5)
3.HTMLParser.get_starttag_text(): 返回当前位置最近的开始标签的内容
所有的内容写完了,最后还有一点注意事项,HTMLParser只是一个简单的模块,解析html的功能并不完善,例如不能准确的分别开标签和"自闭标签",看下面代码:
from HTMLParser import HTMLParser
class MyHTMLParser(HTMLParser):
def handle_starttag(self,tag,attrs):
print 'begin tag',tag
def handle_startendtag(self,tag,attrs):
print 'begin end tag',tag
str1='<br>'
str2='<br/>'
parser=MyHTMLParser()
parser.feed(str1) # 输出 "begin tag br"
parser.feed(str2) # 输出 "begin end br"
猜你喜欢
- 目录使用 sync.WaitGroup空 select死循环用 sync.Mutexos.Signal空 channel 或者 nil ch
- 前言:事务(Transaction)是一组SQL组成的执行单元(Unit),是数据库并发控制和恢复回滚的基本单位。一个事务中可能包含多个SQ
- char(n)是定长格式,格式为char(n)的字段固定占用n个字符宽度,如果实际存放的数据长度超过n将被截取多出部分,如果长度小于n就用空
- 本文实例为大家分享了Python实现俄罗斯方块游戏的具体代码,供大家参考,具体内容如下玩法:童年经典,普通模式没啥意思,小时候我们都是玩加速
- 定位篇UI 自动化很多时候的苦恼都是定位不到,其实说实话我到现在有时候也是莫名其妙的定位到或者定位不到。好在这个框架定位方式的上限非常以及特
- 使用python实现双向循环链表,供大家参考,具体内容如下双向循环链表: 将所有的数据存放到节点中,每一个节点相连接,首尾链接,每一个节点中
- 相比于原生的python开发核心包,Anaconda已经集成了许多的第三方库,但是这在实际应用中是远远不够的,因此我们需要手动安装第三方库使
- 需要实现的组件效果:该组件有设置颜色、大小、旋转度数和文本内容功能。一、组件实现代码组件代码文件结构src/components/Stamp
- 一、桥接模式桥接模式,希望能够将一个事物的两个维度分离(解耦),使其都可以独立地变化,并通过桥梁连接起来。(类)抽象部分(Abstracti
- 一、Mysql锁是什么?锁有哪些类别?锁定义: 同一时间同一资源只能被一个线程访问  
- 根据Django官方文档介绍:A one-to-one relationship. Conceptually, this is simila
- 目录1. 警告不是异常2. 警告能捕获吗3. 捕获警告方法一4. 捕获警告方法二5. 捕获警告方法三1. 警告不是异常你是不是经常在使用一些
- 这个工具是使用Python开发,可以从下面地址了解详情。官网: https://pypi.org/project/webssh/webssh
- 怎么增大MySQL数据库连接数,MYSQL数据库安装完成后,默认连接数是100,流量稍微大一点的论坛或网站这个连接数是不够哟用
- 前言众所周知,网页版的B站无法下载视频,然本人喜欢经常在B站学习,奈何没有网时,无法观看视频资源,手机下载后屏幕太小又不想看,遂写此程序以解
- 学在前面上篇 OpenCV 博客原计划完成一个 识别银行卡号 的项目,但是写的过程中发现,技术储备不足,我无法在下述图片中,提取出卡号区域,
- 1. SELECT INTO 语句用途:SELECT INTO 语句从一个表复制数据,然后把数据插入到另一个新表中,表结构与查询结构一致。P
- MySQL是一个关系型数据库管理系统,由瑞典MySQL AB公司开发,目前属于Oracle公司。MySQL是一种关联数据库管理系统,关联数据
- 1.selenum:三方库。可以实现让浏览器完成自动化的操作。2.环境搭建2.1 安装:pip install selenium2.2 获取
- js运行效果,含公历农历,生肖及节日的javascript日历代码:<html><head><meta htt