请选择 进入手机版 | 继续访问电脑版

Java321技术网

 找回密码
 立即注册
搜索
热搜: centos
查看: 16795|回复: 0

Python爬虫常用之HtmlParser

[复制链接]

39

主题

42

帖子

439

积分

超级版主

Rank: 8Rank: 8

积分
439
发表于 2017-6-16 01:35:44 | 显示全部楼层 |阅读模式
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. class MyHTMLParser(HTMLParser):

  3.     def handle_starttag(self, tag, attrs):
  4.         """
  5.         recognize start tag, like <div>
  6.         :param tag:
  7.         :param attrs:
  8.         :return:
  9.         """
  10.         print("Encountered a start tag:", tag)

  11.     def handle_endtag(self, tag):
  12.         """
  13.         recognize end tag, like </div>
  14.         :param tag:
  15.         :return:
  16.         """
  17.         print("Encountered an end tag :", tag)

  18.     def handle_data(self, data):
  19.         """
  20.         recognize data, html content string
  21.         :param data:
  22.         :return:
  23.         """
  24.         print("Encountered some data  :", data)

  25.     def handle_startendtag(self, tag, attrs):
  26.         """
  27.         recognize tag that without endtag, like <img />
  28.         :param tag:
  29.         :param attrs:
  30.         :return:
  31.         """
  32.         print("Encountered startendtag :", tag)

  33.     def handle_comment(self,data):
  34.         """

  35.         :param data:
  36.         :return:
  37.         """
  38.         print("Encountered comment :", data)


  39. parser = MyHTMLParser()
  40. parser.feed('<html><head><title>Test</title></head>'
  41.             '<body><h1>Parse me!</h1><img src = "" />'
  42.             '<!-- 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>
  16.    
复制代码
 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. def handle_starttag(self, tag, attrs):
  5.     if tag == 'p' and _attr(attrs, 'class') == 'p_font':
  6.         self.flag = True
  7.         
  8. def handle_data(self, data):
  9.     if self.flag == True:
  10.         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. def handle_starttag(self, tag, attrs):
  5.     if tag == 'div':
  6.         self.in_div = True
  7.         
  8. def handle_data(self, data):
  9.     if self.in_div == True and self.lasttag == 'p':
  10.         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)   
  8. 复制代码
复制代码


回复

使用道具 举报

QQ|Archiver|手机版|小黑屋|Java321技术网   蜀ICP备15030946号-1

GMT+8, 2024-4-19 08:38 , Processed in 0.055880 second(s), 22 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表