分类路径:/Datazen/DataMining/Crawler/

前段时间,一朋友让我做个小脚本,抓一下某C2C商城上竞争对手的销售/价格数据,好让他可以实时调整自己的营销策略。自己之前也有过写爬虫抓某宝数据的经历,实现的问题不大,于是就答应了。初步想法是利用pyhton中的urllib.request和re两个lib(本文示例用的是Pyhton 3.4 ,2.x的请自行切换),外加上其他的统计分析功能的话,最多两个晚上(白天要工作)可以搞定。实际上做的过程中,遇到了两个主要困难:

(1)电商网站对于交易数据的保护很好。小爬虫动不动就会被ban掉或者采用一些其他的保护措施使得其无法正常采集所需的数据,需要添加额外的代码处理各种虐心的情况;

(2)正则表达式实在是难写,而且很复杂和很难维护。于是自己也思考有没有其他的解决方案——本文就是对其中一解决方案的初步介绍。

一开始想到的当然是著名的第三方库Beautifulsoup(作为一个广东男人,我习惯把它称为”靓汤“)。这个库很强大,但正因为它强大,需要一点学习时间而我需要快点上手,于是只好日后再学(到时再写一篇Beautifulsoup学习总结)。权衡以后,最后目光转向了Python Standard Library中的html.parser。

html.parser是一个非常简单和实用的库,它的核心是HTMLParser类。从源码来看,它内部封装了一系列regular expression。工作的流程是:当你feed给它一个类似HTML格式的字符串时,它会调用goahead方法向前迭代各个标签,并调用对应的parse_xxxx方法提取start_tag, tag, attrs data comment和end_tag等等标签信息和数据,然后调用对应的方法对这些抽取出来的内容进行处理。整个HTMLParser的大致结构如下图所示:

可以发现,处理开始标签(handle_starttag)、结束标签(handle_endtag)和处理数据(handle_data)等处理函数在HTMLParser里是没有实现的(pass),这需要我们继承HTMLParser这个类的并覆盖这些方法。详细可以参阅python文档,这里重点介绍几个常用的方法:

feed(data):主要用于接受带html标签的str,当调用这个方法时并提供相应的data时,整个实例(instance)开始执行,结束执行close()。

handle_starttag(tag, attrs): 这个方法接收Parse_starttag返回的tag和attrs,并进行处理,处理方式通常由使用者进行覆盖,本身为空。例如,连接的start tag是,那么对应的参数tag=’a’(小写)。attrs是start tag <>中的属性,以元组形式(name, value)返回(所有这些内容都是小写)。例如,对于,那么内部调用形式为:handle_starttag(’a’,[(‘href’,’http://www.baidu.com)]).

handle_endtag(tag):跟上述一样,只是处理的是结束标签,也就是以开头的标签。

handle_data(data):处理的是网页的数据,也就是开始标签和结束标签之间的内容。例如:的省略号内容

reset():将实例重置,包括作为参数输入的数据进行清空。

举个例子吧。例如我们有以下一堆带HTML标签的数据,

【金冠现货/全色/顶配版】Xiaomi/小米 小米note移动联通4G手机

【购机即送布丁套+高清贴膜+线控耳机+剪卡器+电影支架等等,套餐更多豪礼更优惠】    【购机即送布丁套+高清贴膜+线控耳机+剪卡器+电影支架等等,套餐更多豪礼更优惠】    【金冠信誉+顺丰包邮+全国联保---多重保障】

python中html.parser_Python html.parser库学习小结相关推荐

  1. 小结两种在Python中导入C语言扩展库的方法

    小结两种在Python中导入C语言扩展库的方法 分类: Pythoner2009-08-18 20:44 2563人阅读 评论(1) 收藏 举报 python扩展c语言importstring 一种是 ...

  2. 捋一捋Python中的数学运算math库(上篇)

    正式的Python专栏第18篇,同学站住,别错过这个从0开始的文章! 很多学习编程的都多多少少学习了一些数学知识. 学委之前也简单吐槽了 Python中奇葩的round函数! 这篇我们讲讲那些常用的数 ...

  3. Python中的TCP的客户端UDP学习----第一篇博客

    Python中的TCP的客户端&UDP学习--第一篇博客 PS: 每日的怼人句子"我真想把我的脑子放到你的身体里,让你感受一下智慧的光芒" 先说UDP流程 发送: 创建套接 ...

  4. linux 下的动态库制作 以及在python 中如何调用 c 函数库

    linux 下的动态库制作 以及在python 中如何调用 c 函数库 动态库: 动态库又称动态链接库英文为DLL,是Dynamic Link Library 的缩写形式,DLL是一个包含可由多个程序 ...

  5. python取整的几种方法,Python中取整的几种方法小结

    Python中取整的几种方法小结 前言 对每位程序员来说,在编程过程中数据处理是不可避免的,很多时候都需要根据需求把获取到的数据进行处理,取整则是最基本的数据处理.取整的方式则包括向下取整.四舍五入. ...

  6. Python 中 xpath 语法 与 lxml 库解析 HTML/XML 和 CSS Selector

    The lxml.etree Tutorial :https://lxml.de/tutorial.html python3 解析 xml:https://www.cnblogs.com/deadwo ...

  7. Python 中最强大的错误重试库

    作者 | 费弗里 来源丨Python大数据分析 1 简介 我们在编写程序尤其是与网络请求相关的程序,如调用web接口.运行网络爬虫等任务时,经常会遇到一些偶然发生的请求失败的状况,这种时候如果我们仅仅 ...

  8. python中html.parser_python模块之HTMLParser简介

    html.parser是一个非常简单和实用的库,它的核心是HTMLParser类. 工作的流程是:当你feed给它一个类似HTML格式的字符串时,它会调用goahead方法向前迭代各个标签,并调用对应 ...

  9. python中import numpy_Python开发:NumPy学习(一)ndarray数组

    一.数据维度 一个数据表达一个含义,一组数据表达一个或多个含义. 数据维度概念:一组数据的组织形式,其中有一维数据.二维数据.多维数据.高维数据. 1. 一维数据 一维数据由对等关系的有序或无序数据构 ...

最新文章

  1. golang中的strings.ContainsRune
  2. 【吾日三省吾身】2015.6.03-涅槃行动第十六天
  3. Jquery 温习,温故而知新,可以为师矣
  4. 大连交通大学计算机网络,计算机网络题库(大连交通大学)chapter5.doc
  5. 函数sscanf小结
  6. Linux、Ubuntu、CentOS安装和配置zsh
  7. mysql排序同值排名一致
  8. Pytorch 入门之数据处理 -- Dataset、Sampler、DataLoader
  9. DevExpress DXperience 的本地化(汉化)方法
  10. viper4android 6.0脉冲,【详解】v4a音效脉冲样本
  11. Win11怎么设置鼠标箭头图案?Win11更换鼠标图案的方法
  12. python table删除一列_在python中从dataframe中删除多个列
  13. 计算机导论黄国兴百度云,计算机导论黄国兴
  14. response.sendRedirect 加域名或者不加域名的重定向加locahost或者不加localhost
  15. 用数据分析头部微信公众号到底有多牛
  16. JavaScript节点操作、删除节点
  17. java打字游戏课程设计_Java课程设计打字游戏.docx
  18. 【滚动更新】Google退出中国后续报道之二
  19. androidx使用Toolbar
  20. 用一杯水的单纯 面对一辈子的复杂

热门文章

  1. JHipster入门初体验
  2. 如何来实现一个Linux内核的系统调用(基于tiny4412开发板)
  3. 计算机硬件基础-----CPU缓存
  4. python解放军VS木马创意射击游戏
  5. 你真的会画思维导图吗?猿辅导教你3分钟画出一张思维导图
  6. python中的管理文件神器 os.walk
  7. linux cheat,一个cheat命令 == Linux命令小抄大全
  8. Nginx详解upstream模块详解
  9. 还没一瓶可乐大的电脑,居然能带得动大型游戏?
  10. git上传文件失败解决方法