Python 3 解析 html
资料:https://docs.python.org/3/library/html.parser.html
python 自带了一个类,叫 HTMLParser。
我们用的时候需要自己定义一个类,继承自 HTMLParser 。然后重写一部分方法。
下面是我们常用的解析html的方法,可以看到在 HTMLParser 里面,这些方法内容都是空的,也就是如果我们要用某个方法,我们得自己再我们的类里面重写这个方法。具体的每个方法的使用方式参见下文。
- # Overridable -- finish processing of start+end tag: <tag.../>
- def handle_startendtag(self, tag, attrs):
- self.handle_starttag(tag, attrs)
- self.handle_endtag(tag)
- # Overridable -- handle start tag
- def handle_starttag(self, tag, attrs):
- pass
- # Overridable -- handle end tag
- def handle_endtag(self, tag):
- pass
- # Overridable -- handle character reference
- def handle_charref(self, name):
- pass
- # Overridable -- handle entity reference
- def handle_entityref(self, name):
- pass
- # Overridable -- handle data
- def handle_data(self, data):
- pass
- # Overridable -- handle comment
- def handle_comment(self, data):
- pass
- # Overridable -- handle declaration
- def handle_decl(self, decl):
- pass
- # Overridable -- handle processing instruction
- def handle_pi(self, data):
- pass
使用
1. 简单解析
- from html.parser import HTMLParser
- class MyHTMLParser(HTMLParser):
- def handle_starttag(self, tag, attrs):
- print("Encountered a start tag:", tag)
- def handle_endtag(self, tag):
- print("Encountered an end tag :", tag)
- def handle_data(self, data):
- print("Encountered some data :", data)
- parser = MyHTMLParser()
- parser.feed('<html><head><title>Test</title></head><body><h1>Parse me!</h1></body></html>')
这里写了一个类 MyHTMLParse ,继承自 HTMLParser。然后重写了 handle_xxx方法。
然后只要调用该类的 feed() 方法,将html格式的数据传进去,遇到特定的数据,就会自动触发相应的方法。比如遇到<html>就会触发handle_starttag()方法进行处理。
执行结果如下:
- Encountered a start tag: html
- Encountered a start tag: head
- Encountered a start tag: title
- Encountered some data : Test
- Encountered an end tag : title
- Encountered an end tag : head
- Encountered a start tag: body
- Encountered a start tag: h1
- Encountered some data : Parse me!
- Encountered an end tag : h1
- Encountered an end tag : body
- Encountered an end tag : html
2. 复杂解析
- from html.parser import HTMLParser
- from html.entities import name2codepoint
- class MyHTMLParser(HTMLParser):
- def handle_starttag(self, tag, attrs):
- print("Start tag:", tag)
- for attr in attrs:
- print(" attr:", attr)
- def handle_endtag(self, tag):
- print("End tag :", tag)
- def handle_data(self, data):
- print("Data :", data)
- def handle_comment(self, data):
- print("Comment :", data)
- def handle_entityref(self, name):
- c = chr(name2codepoint[name])
- print("Named ent:", c)
- def handle_charref(self, name):
- if name.startswith('x'):
- c = chr(int(name[1:], 16))
- else:
- c = chr(int(name))
- print("Num ent :", c)
- def handle_decl(self, data):
- print("Decl :", data)
- parser = MyHTMLParser()
1)解析文档类型申明
传入html数据如下:
- parser.feed('<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">')
执行结果如下,可以看到会自动调用 handle_decl() 方法。
- Decl : DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"
2) 解析属性
传入html数据如下:
- parser.feed('<img src="python-logo.png" alt="The Python logo">')
执行结果如下,可以看到会自动调用 handle_starttag()方法。
- Start tag: img
- attr: ('src', 'python-logo.png')
- attr: ('alt', 'The Python logo')
3)解析数据以及结束标签
传入html数据如下:
- parser.feed('<style type="text/css">#python { color: green }</style>')
执行结果如下,可以看到会自动调用 handle_data() 以及 handle_endtag()方法。
- Start tag: style
- attr: ('type', 'text/css')
- Data : #python { color: green }
- End tag : style
4)解析备注
传入html数据如下:
- parser.feed('<!-- a comment --><!--[if IE 9]>IE-specific content<![endif]-->')
执行结果如下,可以看到会自动调用 handle_comment()方法。
- Comment : a comment
- Comment : [if IE 9]>IE-specific content<![endif]
5)解析实体字符
传入html数据如下:
- parser.feed('>>>')
在html语言中 ‘>’这个符号,实体名称为 > , 实体编号为 >。这里 >表示16进制数字,3E转化过来和62 是一致的。
执行结果如下,可以看到会自动调用 handle_entityref() 来处理 > ,然后调用 handle_charref()来处理 > 以及 >。
- Named ent: >
- Num ent : >
- Num ent : >
Python 3 解析 html的更多相关文章
- 用 ElementTree 在 Python 中解析 XML
用 ElementTree 在 Python 中解析 XML 原文: http://eli.thegreenplace.net/2012/03/15/processing-xml-in-python- ...
- Python XML解析(转载)
Python XML解析 什么是XML? XML 指可扩展标记语言(eXtensible Markup Language). 你可以通过本站学习XML教程 XML 被设计用来传输和存储数据. XML是 ...
- python高效解析日志入库
python脚本解析日志文件入库一般有三个重要的步骤:读文件.解析文件.入库.在这三个方面下功夫,可确保我们获得最优的性能(这里不讨论并发) 1 读文件:一次读一行,磁盘IO太多,效率低下:一次性读如 ...
- Python网页解析
续上篇文章,网页抓取到手之后就是解析网页了. 在Python中解析网页的库不少,我最开始使用的是BeautifulSoup,貌似这个也是Python中最知名的HTML解析库.它主要的特点就是容错性很好 ...
- [Python]ConfigParser解析配置文件
近期发现非常多接口配置都硬编码在souce file中了,于是就看了下python怎么解析配置文件,重构下这一块. 这个应该是早就要作的... 配置文件: [mysqld] user = mysql ...
- Python 文本解析器
Python 文本解析器 一.课程介绍 本课程讲解一个使用 Python 来解析纯文本生成一个 HTML 页面的小程序. 二.相关技术 Python:一种面向对象.解释型计算机程序设计语言,用它可以做 ...
- Python XML解析之ElementTree
参考网址: http://www.runoob.com/python/python-xml.html https://docs.python.org/2/library/xml.etree.eleme ...
- python大法好——Python XML解析
Python XML解析 什么是XML? XML 被设计用来传输和存储数据. XML是一套定义语义标记的规则,这些标记将文档分成许多部件并对这些部件加以标识. 它也是元标记语言,即定义了用于定义其他与 ...
- python脚本解析json文件
python脚本解析json文件 没写完.但是有效果.初次尝试,写的比较不简洁... 比较烦的地方在于: 1,中文编码: pSpecs.decode('raw_unicode_escape') 2,花 ...
- python dpkt解析ssl流
用法:python extract_tls_flow.py -vr white_pcap/11/2018-01-10_13-05-09_2.pcap -o pcap_ssl_flow.txt & ...
随机推荐
- Mac os 下的文件权限管理
Mac os 下的文件权限管理 命令 ls -l -A 结果 -rw-r--r-- 1 user admin 2326156 4 12 15:24 adb 横线代表空许可.r代表只读,w代表写,x代表 ...
- openstack vm实例pxe无法启动
问题如下: 创建vm没有任何报错,打开控制台提示: SeaBIOS (versio xxxxxxx) Machine UUID xxxxxxxxxx iPXE (http://ipxe.org) 00 ...
- JavaScript初步
隐式转换 其他类型转换成布尔类型: undefined --> false null --> false 0或者0.0或者NaN --> false 字符串长度为0 --> f ...
- [BZOJ4289][PA2012]TAX(最短路)
首先考虑一种暴力做法,为每条边拆成两条有向边,各建一个点.若某两条边有公共点,则在边所对应的点之间连一条边,权值为两条边中的较大值.这样跑最短路是$O(m^2\log m)$的. 用类似网络流中补流的 ...
- NYOJ 298 点的变换 矩阵乘法
http://acm.nyist.net/JudgeOnline/problem.php?pid=298 最好还是自己手推一下矩阵式子..不算太难..但是有一些小知识.... 首先当然是矩阵的细节.. ...
- PHPredis长连接pconnect
1. 当使用pconnect时,连接会被重用,连接的生命周期是fpm进程的生命周期,而非一次php的执行. 疑惑1: fpm进程的生命周期是指 当前那个还是指所有: php-fpm通常是1个ma ...
- iOS防止button重复点击
项目中常会遇到在按钮的点击事件中去执行一些耗时操作.如果处理不当经常会出现连续多次点击push多次的情况,造成不好的用户体验. 一种情况是用户快速连续点击,这种情况无法避免.另一种情况是点击一次后响应 ...
- extjs用iframe的问题
项目中用extjs做前提系统的界面是左边用树做目录 右边用tabpanel做内容展示点击树节点的时候 在tabpanel添加新的tab JScript code var newTab = center ...
- JavaFX学习之Web
PopupFeatures 处理新窗口 WebHistory 网页一般都带有历史记录的功能,可以回退,也可以前进,fx用WebHistory处理. final WebHistory wh = w ...
- Visual Studio 2015的“转到定义”和“查看定义”出错的Bug
今天发现Visual Studio 2015的"转到定义"和"查看定义"时出现如下错误: 它对于自己写的代码工作正常,对于系统函数就出现这个错误,将系统设置还原 ...