Python之HTML的解析(网页抓取一)
http://blog.csdn.net/my2010sam/article/details/14526223
---------------------
对html的解析是网页抓取的基础,分析抓取的结果找到自己想要的内容或标签以达到抓取的目的。
HTMLParser是python用来解析html的模块。它可以分析出html里面的标签、数据等等,是一种处理html的简便途径。 HTMLParser采用的是一种事件驱动的模式,当HTMLParser找到一个特定的标记时,它会去调用一个用户定义的函数,以此来通知程序处理。它主要的用户回调函数的命名都是以handler_开头的,都是HTMLParser的成员函数。当我们使用时,就从HTMLParser派生出新的类,然后重新定义这几个以handler_开头的函数即可。这几个函数包括:
- handle_startendtag 处理开始标签和结束标签
- handle_starttag 处理开始标签,比如<xx> tag不区分大小写
- handle_endtag 处理结束标签,比如</xx>
- handle_charref 处理特殊字符串,就是以&#开头的,一般是内码表示的字符
- handle_entityref 处理一些特殊字符,以&开头的,比如
- handle_data 处理数据,就是<xx>data</xx>中间的那些数据
- handle_comment 处理注释
- handle_decl 处理<!开头的,比如<!DOCTYPE html PUBLIC “-//W3C//DTD HTML 4.01 Transitional//EN”
- handle_pi 处理形如<?instruction>的东西
def handle_starttag(self,tag,attr):
#注意:tag不区分大小写,此时也可以解析 <A 标签
# SGMLParser 会在创建attrs 时将属性名转化为小写。
if tag=='a':
for href,link in attr:
if href.lower()=="href":
pass
1. 基本解析,找到开始和结束标签
- <span style="font-size:18px;">#coding:utf-8
- from HTMLParser import HTMLParser
- '''''
- HTMLParser的成员函数:
- handle_startendtag 处理开始标签和结束标签
- handle_starttag 处理开始标签,比如<xx>
- handle_endtag 处理结束标签,比如</xx>
- handle_charref 处理特殊字符串,就是以&#开头的,一般是内码表示的字符
- handle_entityref 处理一些特殊字符,以&开头的,比如
- handle_data 处理数据,就是<xx>data</xx>中间的那些数据
- handle_comment 处理注释
- handle_decl 处理<!开头的,比如<!DOCTYPE html PUBLIC “-//W3C//DTD HTML 4.01 Transitional//EN”
- handle_pi 处理形如<?instruction>的东西
- '''
- class myHtmlParser(HTMLParser):
- #处理<!开头的内容
- def handle_decl(self,decl):
- print 'Encounter some declaration:'+ decl
- def handle_starttag(self,tag,attrs):
- print 'Encounter the beginning of a %s tag' % tag
- def handle_endtag(self,tag):
- print 'Encounter the end of a %s tag' % tag
- #处理注释
- def handle_comment(self,comment):
- print 'Encounter some comments:' + comment
- if __name__=='__main__':
- a = '<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">\
- <html><head><!--insert javaScript here!--><title>test</title><body><a href="http: //www.163.com">链接到163</a></body></html>'
- m=myHtmlParser()
- m.feed(a)
- m.close()
- 输出结果:
- Encounter some declaration:DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"
- Encounter the beginning of a html tag
- Encounter the beginning of a head tag
- Encounter some comments:insert javaScript here!
- Encounter the beginning of a title tag
- Encounter the end of a title tag
- Encounter the beginning of a body tag
- Encounter the beginning of a a tag
- Encounter the end of a a tag
- Encounter the end of a body tag
- Encounter the end of a html tag</span>
2. 解析html的超链接和链接显示的内容
- <span style="font-size:18px;">#coding:utf-8
- from HTMLParser import HTMLParser
- class myHtmlParser(HTMLParser):
- def __init__(self):
- HTMLParser.__init__(self)
- self.flag=None
- # 这里重新定义了处理开始标签的函数
- def handle_starttag(self,tag,attrs):
- # 判断标签<a>的属性
- if tag=='a':
- self.flag='a'
- for href,link in attrs:
- if href=='href':
- print "href:",link
- def handle_data(self,data):
- if self.flag=='a':
- print "data:",data.decode('utf-8')
- if __name__ == '__main__':
- a = '<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">\
- <html><head><!--insert javaScript here!--><title>test</title><body><a href="http: //www.163.com">链接到163</a></body></html>'
- m=myHtmlParser()
- m.feed(a)
- m.close()
- 输出结果:
- href: http: //www.163.com
- data: 链接到163</span>
或:
- <span style="font-size:18px;">#coding:utf-8
- from HTMLParser import HTMLParser
- import urllib2
- class myparser(HTMLParser):
- # 继承父类初始化方法,并添加一个tag属性
- def __init__(self):
- HTMLParser.__init__(self)
- self.tag = None
- def handle_decl(self,decl):
- print u"声明:",decl
- def handle_starttag(self,tag,attrs):
- print u"开始标签;",tag
- # 判断是否是a开头的标签
- if tag=='a' and len(attrs):
- #设置 self.tag 标记
- self.tag='a'
- for href,link in attrs:
- if href=='href':
- print href+":"+link
- def handle_endtag(self,tag):
- print u"结束标签:",tag
- def handle_data(self,data):
- #处理 a 标签开头的数据
- if self.tag=='a':
- print u"数据内容:",data.decode("utf-8")
- def handle_comment(self,comm):
- print u"注释:",comm
- if __name__ == '__main__':
- a = '<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">\
- <html><head><!--insert javaScript here!--><title>test</title><body><a href="http: //www.163.com">链接到163</a><a href="http: //www.baidu.com">百度</a></body></html>'
- m = myparser()
- m.feed(a)
- 结果:
- 声明: DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"
- 开始标签; html
- 开始标签; head
- 注释: insert javaScript here!
- 开始标签; title
- 结束标签: title
- 开始标签; body
- 开始标签; a
- href:http: //www.163.com
- 数据内容: 链接到163
- 结束标签: a
- 开始标签; a
- href:http: //www.baidu.com
- 数据内容: 百度
- 结束标签: a
- 结束标签: body
- 结束标签: html</span>
Python之HTML的解析(网页抓取一)的更多相关文章
- Python开发爬虫之动态网页抓取篇:爬取博客评论数据——通过Selenium模拟浏览器抓取
区别于上篇动态网页抓取,这里介绍另一种方法,即使用浏览器渲染引擎.直接用浏览器在显示网页时解析 HTML.应用 CSS 样式并执行 JavaScript 的语句. 这个方法在爬虫过程中会打开一个浏览器 ...
- Python开发爬虫之静态网页抓取篇:爬取“豆瓣电影 Top 250”电影数据
所谓静态页面是指纯粹的HTML格式的页面,这样的页面在浏览器中展示的内容都在HTML源码中. 目标:爬取豆瓣电影TOP250的所有电影名称,网址为:https://movie.douban.com/t ...
- Python实现简单的网页抓取
现在开源的网页抓取程序有很多,各种语言应有尽有. 这里分享一下Python从零开始的网页抓取过程 第一步:安装Python 点击下载适合的版本https://www.python.org/ 我这里选择 ...
- Python网络爬虫笔记(一):网页抓取方式和LXML示例
(一) 三种网页抓取方法 1. 正则表达式: 模块使用C语言编写,速度快,但是很脆弱,可能网页更新后就不能用了. 2. Beautiful Soup 模块使用Python编写,速度慢. ...
- Python爬虫之三种网页抓取方法性能比较
下面我们将介绍三种抓取网页数据的方法,首先是正则表达式,然后是流行的 BeautifulSoup 模块,最后是强大的 lxml 模块. 1. 正则表达式 如果你对正则表达式还不熟悉,或是需要一些提 ...
- python网络爬虫-动态网页抓取(五)
动态抓取的实例 在开始爬虫之前,我们需要了解一下Ajax(异步请求).它的价值在于在与后台进行少量的数据交换就可以使网页实现异步更新. 如果使用Ajax加载的动态网页抓取,有两种方法: 通过浏览器审查 ...
- python网络爬虫之解析网页的BeautifulSoup(爬取电影图片)[三]
目录 前言 一.BeautifulSoup的基本语法 二.爬取网页图片 扩展学习 后记 前言 本章同样是解析一个网页的结构信息 在上章内容中(python网络爬虫之解析网页的正则表达式(爬取4k动漫图 ...
- python网络爬虫-静态网页抓取(四)
静态网页抓取 在网站设计中,纯HTML格式的网页通常被称之为静态网页,在网络爬虫中静态网页的数据比较容易抓取,因为说有的数据都呈现在网页的HTML代码中.相对而言使用Ajax动态加载的玩个的数据不一定 ...
- python爬虫之分析Ajax请求抓取抓取今日头条街拍美图(七)
python爬虫之分析Ajax请求抓取抓取今日头条街拍美图 一.分析网站 1.进入浏览器,搜索今日头条,在搜索栏搜索街拍,然后选择图集这一栏. 2.按F12打开开发者工具,刷新网页,这时网页回弹到综合 ...
随机推荐
- From COM to COM 侯捷 1998.06.12
摘要: 本文簡介 C++ Object Model 和 Component Object Model 的基本概念,並引介四本書籍: 1. Inside The C++ Object Model 2. ...
- 基于FPGA具有容错能理的异步串口程序设计
首先,问题源于一个项目.本来是一个很简单的多个串口收发FIFO存取数据的小程序,通过电脑验证也可用,而下位机板子之间通信就出现了丢数问题. 经过分析原因如下: 我的串口收模块是基于特权同学的开发板程序 ...
- Java中编写线程安全代码的原理(Java concurrent in practice的快速要点)
Java concurrent in practice是一本好书,不过太繁冗.本文主要简述第一部分的内容. 多线程 优势 与单线程相比,可以利用多核的能力; 可以方便的建模成一个线程处理一种任务; 与 ...
- 「CF744C」Hongcow Buys a Deck of Cards「状压 DP」
题意 你有\(n\)个物品,物品和硬币有\(A\),\(B\)两种类型,假设你有\(M\)个\(A\)物品和\(N\)个\(B\)物品 每一轮你可以选择获得\(A, B\)硬币各\(1\)个,或者(硬 ...
- Ocelot(三)- 服务发现
Ocelot(三)- 服务发现 作者:markjiang7m2 原文地址:https://www.cnblogs.com/markjiang7m2/p/10907856.html 源码地址:https ...
- matlab矩阵与数组
数组运算:数与数组加减:k+/-A %k加或减A的每个元素数组乘数组: A.*B %对应元素相乘数组乘方: A.^k %A的每个元素k次方:k.^A,分别以k为底A的各元素为指数求幂值数除以数组: k ...
- 在mac上使用sublime text3搭建opencv3开发环境
安装sublime text3 打开mac终端,安装brew 安装opencv3,终端输入下面的coomand: brew install opencv@3 注意:@3表示安装的版本,如果不加@3,那 ...
- MVVM与Controller瘦身实践
MVC是一个做iOS开发都知道的设计模式,也是Apple官方推荐的设计模式.实际上,Cocoa Touch就是按照MVC来设计的. 这里,我们先不讲MVC是什么,我们先来谈谈软件设计的一些原则或者说理 ...
- 说一说solr在tomcat,jetty上的运行和安装优缺点
本文是我从别的文章中组合而成的,结合自己实际操作进行了修改. Solr是什么 Solr 是Apache下的一个顶级开源项目,采用Java开发,它是基于Lucene的全文搜索服务器.Solr提供了比Lu ...
- centos7安装配置docker
1. 安装/升级Docker客户端 Docker 要求 CentOS 系统的内核版本高于 3.10 ,查看本页面的前提条件来验证你的CentOS 版本是否支持 Docker . uname -r 从 ...