文档章节

九Python之HTML的解析(网页抓取一)

dkz
 dkz
发布于 2013/03/05 09:56
字数 1131
阅读 1.7K
收藏 10

对html的解析是网页抓取的基础,分析抓取的结果找到自己想要的内容或标签以达到抓取的目的。   

    HTMLParser是python用来解析html的模块。它可以分析出html里面的标签、数据等等,是一种处理html的简便途径。 HTMLParser采用的是一种事件驱动的模式,当HTMLParser找到一个特定的标记时,它会去调用一个用户定义的函数,以此来通知程序处理。它主要的用户回调函数的命名都是以handler_开头的,都是HTMLParser的成员函数。当我们使用时,就从HTMLParser派生出新的类,然后重新定义这几个以handler_开头的函数即可。这几个函数包括:

  • handle_startendtag  处理开始标签和结束标签
  • handle_starttag     处理开始标签,比如<xx>
  • handle_endtag       处理结束标签,比如</xx>
  • handle_charref      处理特殊字符串,就是以&#开头的,一般是内码表示的字符
  • handle_entityref    处理一些特殊字符,以&开头的,比如 &nbsp;
  • handle_data         处理数据,就是<xx>data</xx>中间的那些数据
  • handle_comment      处理注释
  • handle_decl         处理<!开头的,比如<!DOCTYPE html PUBLIC “-//W3C//DTD HTML 4.01 Transitional//EN”
  • handle_pi           处理形如<?instruction>的东西

1. 基本解析,找到开始和结束标签

from html.parser import HTMLParser

class MyHTMLParser(HTMLParser):

    def handle_starttag(self, tag, attrs):
        print("Encountered the beginning of a %s tag" %(tag))

    def handle_endtag(self, tag):
        print ("Encountered the end of a %s tag" %(tag))

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()
    #传入要分析的html模块
    m.feed(a)
运行结果 
Encountered the beginning of a html tag
Encountered the beginning of a head tag
Encountered the beginning of a title tag
Encountered the end of a title tag
Encountered the beginning of a body tag
Encountered the beginning of a a tag
Encountered the end of a a tag
Encountered the end of a body tag
Encountered the end of a html tag  


2. 解析html的超链接和链接显示的内容  

from html.parser import HTMLParser

class MyHTMLParser(HTMLParser):
    def __init__(self):
        HTMLParser.__init__(self)
        self.flag=None

    def handle_starttag(self, tag, attrs):
    # 这里重新定义了处理开始标签的函数
        if tag == 'a':
    # 判断标签<a>的属性
            self.flag='a'
            for name,value in attrs:
                if name == 'href':
                    print("href:"+value)

    def handle_data(self,data):
        if self.flag == 'a':
            print("data:"+data)

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>'
    my = MyHTMLParser()
    my.feed(a)
运行结果
href:http: //www.163.com
data:链接到163

 

3. 完整解析html元素,拼接后原样输出

from html.parser import HTMLParser
import html.entities

class BaseHTMLProcessor(HTMLParser):
	def reset(self):
		# extend (called by HTMLParser.__init__)
		self.pieces = []
		HTMLParser.reset(self)

	def handle_starttag(self, tag, attrs):
		# called for each start tag
		# attrs is a list of (attr, value) tuples
		# e.g. for <pre class="screen">, tag="pre", attrs=[("class", "screen")]
		# Ideally we would like to reconstruct original tag and attributes, but
		# we may end up quoting attribute values that weren't quoted in the source
		# document, or we may change the type of quotes around the attribute value
		# (single to double quotes).
		# Note that improperly embedded non-HTML code (like client-side Javascript)
		# may be parsed incorrectly by the ancestor, causing runtime script errors.
		# All non-HTML code must be enclosed in HTML comment tags (<!-- code -->)
		# to ensure that it will pass through this parser unaltered (in handle_comment).
		strattrs = "".join([' %s="%s"' % (key, value) for key, value in attrs])
		self.pieces.append("<%(tag)s%(strattrs)s>" % locals())

	def handle_endtag(self, tag):
		# called for each end tag, e.g. for </pre>, tag will be "pre"
		# Reconstruct the original end tag.
		self.pieces.append("</%(tag)s>" % locals())

	def handle_charref(self, ref):
		# called for each character reference, e.g. for "&#160;", ref will be "160"
		# Reconstruct the original character reference.
		self.pieces.append("&#%(ref)s;" % locals())

	def handle_entityref(self, ref):
		# called for each entity reference, e.g. for "&copy;", ref will be "copy"
		# Reconstruct the original entity reference.
		self.pieces.append("&%(ref)s" % locals())
		# standard HTML entities are closed with a semicolon; other entities are not
		if entities.entitydefs.has_key(ref):
			self.pieces.append(";")

	def handle_data(self, text):
		# called for each block of plain text, i.e. outside of any tag and
		# not containing any character or entity references
		# Store the original text verbatim.
		self.pieces.append(text)

	def handle_comment(self, text):
		# called for each HTML comment, e.g. <!-- insert Javascript code here -->
		# Reconstruct the original comment.
		# It is especially important that the source document enclose client-side
		# code (like Javascript) within comments so it can pass through this
		# processor undisturbed; see comments in unknown_starttag for details.
		self.pieces.append("<!--%(text)s-->" % locals())

	def handle_pi(self, text):
		# called for each processing instruction, e.g. <?instruction>
		# Reconstruct original processing instruction.
		self.pieces.append("<?%(text)s>" % locals())

	def handle_decl(self, text):
		# called for the DOCTYPE, if present, e.g.
		# <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
		#	 "http://www.w3.org/TR/html4/loose.dtd">
		# Reconstruct original DOCTYPE
		self.pieces.append("<!%(text)s>" % locals())

	def output(self):
		"""Return processed HTML as a single string"""
		return "".join(self.pieces)

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>'
    
    bhp =BaseHTMLProcessor()
    bhp.feed(a)
    print(bhp.output())


运行结果
<!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>

© 著作权归作者所有

dkz

dkz

粉丝 42
博文 40
码字总数 26789
作品 0
架构师
私信 提问
加载中

评论(2)

chocoball
chocoball

引用来自“Kevin_Yang”的评论

第一行和引入应该是
from HTMLParser import HTMLParser 吧?
对。
Kevin_Yang
Kevin_Yang
第一行和引入应该是
from HTMLParser import HTMLParser 吧?
Python爬虫原理详解 简单易懂

什么是Python爬虫?Python爬虫原理是什么?Python爬虫代码是如何实现的?码笔记分享Python介绍及爬虫原理详解: 什么是Python爬虫? 我们可以把互联网看成是各种信息的站点及网络设备在一起组...

张扯淡
2019/07/26
0
0
Python开发简单爬虫--学习笔记

一、概述 目标 掌握开发轻量级爬虫 内容 爬虫简介 简单爬虫架构 URL管理器 网页下载器(urllib2) 网页解析器(BeautifulSoup) 完整实例:爬取百度百科雷军词条相关的1000个页面数据 tips: 轻量...

老男孩coder
2018/06/17
0
0
Python爬虫入门:爬虫基础了解

有粉丝私信我想让我出更基础一些的,我就把之前平台的copy下来了,可以粗略看一下,之后都会慢慢出。 1.什么是爬虫 爬虫,即网络爬虫,大家可以理解为在网络上爬行的一直蜘蛛,互联网就比作一...

天才小熊猫QAQ
2017/10/30
133
0
Python 爬虫入门(一)——爬取糗百

爬取糗百内容 GitHub 代码地址https://github.com/injetlee/Python/blob/master/qiubaicrawer.py 微信公众号:【智能制造专栏】,欢迎关注。 本文目标 掌握爬虫的基本概念 Requests 及 Beau...

李英杰同学
2018/07/26
0
0
python/java 解析 HTML 网页数据的几种方法简介

工作中经常与数据打交道,去网上抓取数据也成了家常便饭。以前就准备抽空总结下的。 最近刚好看到 http://segmentfault.com/q/1010000000124036 上这篇文章有人问到了, 而且下面有热心pytho...

大数据之路
2012/10/17
2.3K
0

没有更多内容

加载失败,请刷新页面

加载更多

突破CRUD | 万能树工具类封装

0、学完本文你或许可以收获 感受一个树工具从初始逐步优化完善的过程 树工具封装的设计思考与实现思路 最后收获一款拿来即用的树工具源代码 对于前端树组件有一定了解和使用过的同学可直接跳...

风象南
20分钟前
54
0
精选开源SpringBoot项目:涵盖权限、搜索、秒杀、支付!

发文以来,分享了一些科技资讯,今天首次整理一些开源项目分享。既是对自己的学习督促,也是对有需要人的一种便利。 开源项目一: mall商城 star数:29.8k 项目地址:https://github.com/ma...

Java进阶程序员xx
30分钟前
38
0
Xilinx Zynq-7000 SoC高性能处理器的串口、CAN接口

TLZ7x-EasyEVM是广州创龙基于Xilinx Zynq-7000 SoC设计的高速数据采集处理开发板,采用核心板+底板的设计方式,尺寸为160mm*108mm,它主要帮助开发者快速评估核心板的性能。 核心板采用12层板...

Tronlong创龙
45分钟前
55
0
工作记录-图片高亮和 IE 下载图片错误

去年年底换了新的新项目组,又开始用自己喜欢的 angular 框架开发了,开心[眯眼笑]。这段时间做了几个需求,这里记录一下需要注意的几个点。 图片高亮功能 在原来的DOM层上添加遮罩,添加新的...

IrisHuang
今天
71
0
如何修复MacBook Pro过热:保持MacBook散热的13个技巧

尽管MacBook Pro是一台能处理繁重工作量的高能效机器,但它却无法像市场上其他笔记本电脑一样避免过热。至于什么可以防止发热,那不是一两个技巧就能解决的问题。相反,这是一组技巧可以解决...

mac小叮当
今天
49
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部