Python HTMLParser模块详解与贴吧图片抓取实战

季宁
季宁
发布时间:2026-10-13 | 5人浏览过
原创

本文深入解析Python内置HTMLParser模块的工作原理,详细列举handle_starttag等核心回调函数。通过一个完整的贴吧图片抓取实例,演示如何继承HTMLParser并重写方法以提取GIF和JPG链接,实现自动下载功能,为Python爬虫开发提供实用参考。

本文详细介绍Python中HTML解析模块HTMLParser的具体用法,旨在为读者提供清晰的参考与指导。

HTMLParser模块简介

简介

HTMLParser是Python标准库中用于解析HTML文档的内置模块,能够高效提取HTML中的标签及数据,是处理HTML内容的便捷工具。该模块基于事件驱动模式运行:当解析器识别到特定标记时,会触发调用用户自定义的回调函数。这些回调函数通常以"handle_"为前缀,且均为HTMLParser类的成员函数。使用时,需从HTMLParser派生新类,并重新定义相关的手柄函数即可实现自定义解析逻辑。

核心手柄函数详解

主要的手柄函数包括: (1)handle_startendtag:用于处理自闭合标签(即单标签)。 (2)handle_starttag:用于处理开始标签,例如<xx>。 (3)handle_endtag:用于处理结束标签,例如</xx>。 (4)handle_charref:用于处理以&#开头的特殊字符串,通常表示由内码表示的字符。 (5)handle_entityref:用于处理以&开头的特殊字符实体,例如&nbsp;。 (6)handle_data:用于处理标签内的文本数据,即<xx>与</xx>之间的内容。 (7)handle_comment:用于处理HTML注释。 (8)handle_decl:用于处理以<!开头的声明,例如<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"。 (9)handle_pi:用于处理形如<?instruction>的处理指令。

贴吧图片抓取实战

实例

接下来通过一个具体的爬虫案例进行演示:抓取百度贴吧中的图片。


from html.parser import HTMLParser
from urllib import request
class MyHTMLParser(HTMLParser):   # 创建HTML解析类
  def __init__(self):
    HTMLParser.__init__(self)
    self.gifs_urls = []     # 创建列表,保存gif
    self.jpgs_urls = []     # 创建列表,保存jpg
  # 重写HTMLParser中的内置方法
  def handle_starttag(self, tags, attrs): # 处理起始标记
    if tags == 'img':  # 处理图片
      for attr in attrs:
        for t in attr:
          if 'gif' in t and 'https' in t:
            self.gifs_urls.append(t)  # 添加到gif列表
          elif 'jpg' in t and 'https' in t:
            self.jpgs_urls.append(t)  # 添加到jpg列表
          else:
            pass
  # 自定义的方法
  def get_gifs(self):   # 返回gif列表
    return self.gifs_urls
  def get_jpgs(self):   # 返回jpg列表
    return self.jpgs_urls
  # 自定义的方法,获取页面
  def getHTML(self,url):
    req=request.Request(url,method='GET')
    html=request.urlopen(req,timeout=30)
    return html.read()
  # 自定义的方法,批量下载图片
  def downImgs(self,img_urls,n=10,path='Image/'):
    count=1
    for url in img_urls:
      request.urlretrieve(url=url,filename='{0}{1}{2}'.format(path,count,'.jpg'))
      count=count+1
      if count == n + 1:
        print('共下载%d张图片' %(n))
        return
if __name__ == '__main__':
  Url = 'http://tieba.baidu.com/p/2256306796'
  HtmlParser=MyHTMLParser()
  Html=HtmlParser.getHTML(Url)
  # print(Html)
  HtmlParser.feed(str(Html))   #开始解析HTML,自动调用HTMLParser中的内置方法
  HtmlParser.downImgs(HtmlParser.get_jpgs())

如需了解更多Python相关知识,可参考本站系列教程:《Python Socket编程技巧总结》、《Python正则表达式用法总结》、《Python数据结构与算法教程》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》、《Python入门与进阶经典教程》及《Python文件与目录操作技巧汇总》。

希望本文的内容能对您的Python编程学习有所帮助。

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表