greenss 发表于 2017-6-16 01:35:44

Python爬虫常用之HtmlParser

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) ,处理注释,<!-- -->之间的文本
二、基本使用  不多说,上代码from html.parser import HTMLParser


class MyHTMLParser(HTMLParser):

    def handle_starttag(self, tag, attrs):
      """
      recognize start tag, like <div>
      :param tag:
      :param attrs:
      :return:
      """
      print("Encountered a start tag:", tag)

    def handle_endtag(self, tag):
      """
      recognize end tag, like </div>
      :param tag:
      :return:
      """
      print("Encountered an end tag :", tag)

    def handle_data(self, data):
      """
      recognize data, html content string
      :param data:
      :return:
      """
      print("Encountered some data:", data)

    def handle_startendtag(self, tag, attrs):
      """
      recognize tag that without endtag, like <img />
      :param tag:
      :param attrs:
      :return:
      """
      print("Encountered startendtag :", tag)

    def handle_comment(self,data):
      """

      :param data:
      :return:
      """
      print("Encountered comment :", data)


parser = MyHTMLParser()
parser.feed('<html><head><title>Test</title></head>'
            '<body><h1>Parse me!</h1><img src = "" />'
            '<!-- comment --></body></html>')
以上是根据python手册写的基本使用,解析了一个简单的html。可以运行看看,主要用于了解各个函数负责解析的部分,以及解析顺序。
三、实用案例  以下的实用案例均在上面的代码中修改对应函数,每个实例都是单独的。  解析的html如下:
<html>
    <head>
      <title>Test</title>
    </head>
    <body>
      <h1>Parse me!</h1>
      <img src = "" />
      <p>A paragraph.</p>
                <p class = "p_font">A paragraph with class.</p>
                <!-- comment -->
      <div>
            <p>A paragraph in div.</p>
      </div>
    </body>
</html>
     1.获取属性的函数,是个静态函数,新增的。直接定义在类中,返回属性名对应的属性def _attr(attrlist, attrname):
    for attr in attrlist:
      if attr == attrname:
            return attr
    return None2.获取所有p标签的文本,最简单方法只修改handle_datadef handle_data(self, data):
    if self.lasttag == 'p':
      print("Encountered p data:", data)3.获取css样式(class)为p_font的p标签的文本,使用了案例1,增加一个实例属性作为标志,选取需要的标签def __init__(self):
    HTMLParser.__init__(self)
    self.flag = False

def handle_starttag(self, tag, attrs):
    if tag == 'p' and _attr(attrs, 'class') == 'p_font':
      self.flag = True
      
def handle_data(self, data):
    if self.flag == True:
      print("Encountered p data:", data)4.获取p标签的属性列表def handle_starttag(self, tag, attrs):
    if tag == 'p':
      print("Encountered p attrs:", attrs)5.获取p标签的class属性def handle_starttag(self, tag, attrs):
    if tag == 'p' and _attr(attrs, 'class'):
      print("Encountered p class:", _attr(attrs, 'class'))6.获取div下的p标签的文本def __init__(self):
    HTMLParser.__init__(self)
    self.in_div = False

def handle_starttag(self, tag, attrs):
    if tag == 'div':
      self.in_div = True
      
def handle_data(self, data):
    if self.in_div == True and self.lasttag == 'p':
      print("Encountered p data:", data)7.处理注释中的标签,若需要的数据在注释中,使用一般函数解析不到  处理方法为,写两个类,继承HTMLParser。在其中一个类的handle_comment里实例化解析类,和其他标签一样解析  这里的MyHTMLParser可以为基本使用中的MyHTMLParser,或者按需重写。class CommentHTMLParser(HTMLParser):
    def __init__(self):
      HTMLParser.__init__(self)
      
    def handle_comment(self,data):
      cparser = MyHTMLParser()
      cparser.feed(data)   
复制代码

页: [1]
查看完整版本: Python爬虫常用之HtmlParser