HtmlParser,顾名思义,是解析Html的一个工具。python自带的。

一、常用属性和方法介绍

  HtmlParser是一个类,在使用时一般继承它然后重载它的方法,来达到解析出需要的数据的目的。

  1.常用属性:

    lasttag,保存上一个解析的标签名,是字符串。

  2.常用方法: 

    handle_starttag(tag, attrs) ,处理开始标签,比如<div>;这里的attrs获取到的是属性列表,属性以元组的方式展示
    handle_endtag(tag) ,处理结束标签,比如</div>
    handle_startendtag(tag, attrs) ,处理自己结束的标签,如<img />
    handle_data(data) ,处理数据,标签之间的文本
    handle_comment(data) ,处理注释,<!-- -->之间的文本

二、基本使用

  不多说,上代码

  1. from html.parser import HTMLParser
  2.  
  3. class MyHTMLParser(HTMLParser):
  4.  
  5. def handle_starttag(self, tag, attrs):
  6. """
  7. recognize start tag, like <div>
  8. :param tag:
  9. :param attrs:
  10. :return:
  11. """
  12. print("Encountered a start tag:", tag)
  13.  
  14. def handle_endtag(self, tag):
  15. """
  16. recognize end tag, like </div>
  17. :param tag:
  18. :return:
  19. """
  20. print("Encountered an end tag :", tag)
  21.  
  22. def handle_data(self, data):
  23. """
  24. recognize data, html content string
  25. :param data:
  26. :return:
  27. """
  28. print("Encountered some data :", data)
  29.  
  30. def handle_startendtag(self, tag, attrs):
  31. """
  32. recognize tag that without endtag, like <img />
  33. :param tag:
  34. :param attrs:
  35. :return:
  36. """
  37. print("Encountered startendtag :", tag)
  38.  
  39. def handle_comment(self,data):
  40. """
  41.  
  42. :param data:
  43. :return:
  44. """
  45. print("Encountered comment :", data)
  46.  
  47. parser = MyHTMLParser()
  48. parser.feed('<html><head><title>Test</title></head>'
  49. '<body><h1>Parse me!</h1><img src = "" />'
  50. '<!-- comment --></body></html>')

  以上是根据python手册写的基本使用,解析了一个简单的html。可以运行看看,主要用于了解各个函数负责解析的部分,以及解析顺序。

三、实用案例

  以下的实用案例均在上面的代码中修改对应函数,每个实例都是单独的。

  解析的html如下:

  1. <html>
  2. <head>
  3. <title>Test</title>
  4. </head>
  5. <body>
  6. <h1>Parse me!</h1>
  7. <img src = "" />
  8. <p>A paragraph.</p>
  9. <p class = "p_font">A paragraph with class.</p>
  10. <!-- comment -->
  11. <div>
  12. <p>A paragraph in div.</p>
  13. </div>
  14. </body>
  15. </html>

  1.获取属性的函数,是个静态函数,新增的。直接定义在类中,返回属性名对应的属性

  1. def _attr(attrlist, attrname):
  2. for attr in attrlist:
  3. if attr[0] == attrname:
  4. return attr[1]
  5. return None

  2.获取所有p标签的文本,最简单方法只修改handle_data

  1. def handle_data(self, data):
  2. if self.lasttag == 'p':
  3. print("Encountered p data :", data)

  3.获取css样式(class)为p_font的p标签的文本,使用了案例1,增加一个实例属性作为标志,选取需要的标签

  1. def __init__(self):
  2. HTMLParser.__init__(self)
  3. self.flag = False
  4.  
  5. def handle_starttag(self, tag, attrs):
  6. if tag == 'p' and _attr(attrs, 'class') == 'p_font':
  7. self.flag = True
  8.  
  9. def handle_data(self, data):
  10. if self.flag == True:
  11. print("Encountered p data :", data)

  4.获取p标签的属性列表

  1. def handle_starttag(self, tag, attrs):
  2. if tag == 'p':
  3. print("Encountered p attrs :", attrs)

  5.获取p标签的class属性

  1. def handle_starttag(self, tag, attrs):
  2. if tag == 'p' and _attr(attrs, 'class'):
  3. print("Encountered p class :", _attr(attrs, 'class'))

  6.获取div下的p标签的文本

  1. def __init__(self):
  2. HTMLParser.__init__(self)
  3. self.in_div = False
  4.  
  5. def handle_starttag(self, tag, attrs):
  6. if tag == 'div':
  7. self.in_div = True
  8.  
  9. def handle_data(self, data):
  10. if self.in_div == True and self.lasttag == 'p':
  11. print("Encountered p data :", data)

  7.处理注释中的标签,若需要的数据在注释中,使用一般函数解析不到

    处理方法为,写两个类,继承HTMLParser。在其中一个类的handle_comment里实例化解析类,和其他标签一样解析

    这里的MyHTMLParser可以为基本使用中的MyHTMLParser,或者按需重写。

  1. class CommentHTMLParser(HTMLParser):
  2. def __init__(self):
  3. HTMLParser.__init__(self)
  4.  
  5. def handle_comment(self,data):
  6. cparser = MyHTMLParser()
  7. cparser.feed(data)

Python爬虫常用之HtmlParser的更多相关文章

  1. Python爬虫常用小技巧之设置代理IP

    设置代理IP的原因 我们在使用Python爬虫爬取一个网站时,通常会频繁访问该网站.假如一个网站它会检测某一段时间某个IP的访问次数,如果访问次数过多,它会禁止你的访问.所以你可以设置一些代理服务器来 ...

  2. 爬虫-Python爬虫常用库

    一.常用库 1.requests 做请求的时候用到. requests.get("url") 2.selenium 自动化会用到. 3.lxml 4.beautifulsoup 5 ...

  3. python爬虫常用第三方库

    这个列表包含与网页抓取和数据处理的Python库 网络 通用 urllib -网络库(stdlib). requests -网络库. grab – 网络库(基于pycurl). pycurl – 网络 ...

  4. Python 爬虫常用的库

    一.常用库 1.requests 做请求的时候用到. requests.get("url") 2.selenium 自动化会用到. 3.lxml 4.beautifulsoup 5 ...

  5. Python爬虫常用之PyQuery

    PyQuery是解析页面常用的库.是python对jquery的封装.下面是一份解析基本页面的代码.后期用到复杂或者实用的方式再增加. from pyquery import PyQuery as p ...

  6. Python爬虫常用:谷歌浏览器驱动——Chromedriver 插件安装教程

    我们在做爬虫的时候经常要使用谷歌浏览器驱动,今天分享下这个Chromedriver 插件的安装方法. 第一步:打开谷歌浏览器打开设置面板 嫌枯燥的小伙伴可以点击此处找管理员小姐姐领取免费资料 第二步: ...

  7. python爬虫常用之Scrapy 中间件

    一.概述 1.中间件的作用 在scrapy运行的整个过程中,对scrapy框架运行的某些步骤做一些适配自己项目的动作. 例如scrapy内置的HttpErrorMiddleware,可以在http请求 ...

  8. python爬虫常用之Scrapy 简述

    一.安装 pip install scrapy. 如果提示需要什么包就装什么包 有的包pip安装不起,需要自己下载whl文件进行安装. 二.基本的爬虫流程 通用爬虫有如下几步: 构造url --> ...

  9. Python爬虫常用之登录(三) 使用http请求登录

    前面说了使用浏览器登录较为简单,不需要过多分析,而使用请求登录恰恰就是以分析为主. 开发一个请求登录程序的流程: 分析请求->模拟请求->测试登录->调整参数->测试登录-&g ...

随机推荐

  1. C# DateTime.ToString()的各种日期格式

    DateTime.ToString()的各种日期格式 例: ToString:2016/9/27 0:00:00 ToString("yyyy/MM/dd"):2016/09/27 ...

  2. 现代C++学习笔记之一资料篇(C++ 11)

    最近看网上一些开源的源代码,发现尽多不认识的符号,好吧.开始学习新的C++. C++经典书籍 C++ Primer,第五版开始有了对C++ 11的讲解 C++ Primer Plus,第六版有对C++ ...

  3. javaweb dom4j解析xml文档

    1.什么是dom4j dom4j是一个Java的XML API,是jdom的升级品,用来读写XML文件的.dom4j是一个十分优秀的JavaXML API,具有性能优异.功能强大和极其易使用的特点,它 ...

  4. 编写高质量代码改善C#程序的157个建议——建议7: 将0值作为枚举的默认值

    建议7: 将0值作为枚举的默认值 允许使用的枚举类型有byte.sbyte.short.ushort.int.uint.long和ulong.应该始终将0值作为枚举类型的默认值.不过,这样做不是因为允 ...

  5. 20169219 实验四Android程序设计

    一.实现Linux下dc的功能,计算后缀表达式的值 public int evaluate(String expr) { int op1, op2, result = 0; String token; ...

  6. ICallbackEventHandler使用

    后端:页面需继承ICallbackEventHandler protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack ...

  7. C#多线程编程实战1.2暂停线程(休眠)

    using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threa ...

  8. Linux 内核list_head 学习

    Linux 内核list_head 学习(一) http://www.cnblogs.com/zhuyp1015/archive/2012/06/02/2532240.html 在Linux内核中,提 ...

  9. OOP1(定义基类和派生类)

    面向对象程序设计基于三个基本概念:数据抽象,继承和动态绑定 数据抽象是一种依赖于接口和实现分离的编程技术.继承和动态绑定对程序的编号有两方面的影响:一是我们可以更容易地定义与其它类相似但不完全相同的类 ...

  10. [AGC005C]Tree Restoring 构造

    Description ​ 给出一个数组a,要求构造一颗树,使节点x距离最远的点的距离为\(a_x\). Input ​ 第一行一个正整数NN(2≤N≤1002≤N≤100) ​ 接下来一行,有NN个 ...