返回顶部
首页 > 资讯 > 后端开发 > Python >Python:HTMLParser模块进
  • 309
分享到

Python:HTMLParser模块进

模块PythonHTMLParser 2023-01-31 02:01:34 309人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

    这是从用python开发开始到现在第二次使用htmlParser模块进行html解析了,第一次用的时候,由于是刚刚接触python,对其中的一些用法不是很理解,因为赶进度,虽然照着参考资料也写出来了,但是其中的原理还是不怎么了解。第

    这是从用python开发开始到现在第二次使用htmlParser模块进行html解析了,第一次用的时候,由于是刚刚接触python,对其中的一些用法不是很理解,因为赶进度,虽然照着参考资料也写出来了,但是其中的原理还是不怎么了解。第二次用的时候,有一定的经验了,对Python的理解也更加深刻了,所以第二次用的时候,对HTMLParser模块的一些用法不像第一次用时那么茫然。结合鄙人第二次用该模块的经验,来讲讲HTMLParser模块的基本使用方法,希望对你有帮助。

    HTMLParser是python用来解析html的模块。它可以分析出html里面的标签、数据等等,是一种处理html的简便途径。HTMLParser采用的是一种事件驱动的模式,当HTMLParser找到一个特定的标记时,它会去调用一个用户定义的函数,以此来通知程序处理。它主要的用户回调函数的命名都是以handler_开头的,都是HTMLParser的成员函数。当我们使用时,就从HTMLParser派生出新的类,然后重新定义这几个以handler_开头的函数即可。这几个函数包括:

handle_startendtag(tag, attrs)  处理开始标签和结束标签

handle_starttag(tag, attrs)     处理开始标签,比如<xx>

handle_endtag(tag)       处理结束标签,比如</xx>

handle_charref(name)      处理特殊字符串,就是以&#开头的,一般是内码表示的字符

handle_entityref(name)    处理一些特殊字符,以&开头的,比如  

handle_data(data)         处理数据,就是<xx>data</xx>中间的那些数据

handle_comment(data)      处理注释

handle_decl(decl)         处理<!开头的,比如<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"

handle_pi(data)           处理形如<?instruction>的东西


tag是的html标签,attrs是 (属性,值)元组(tuple)的列表(list). 

HTMLParser自动将tag和attrs都转为小写。

下面以从中国银行官网上解析html文件以获取实时汇率(这就是我第二此用该模块时的解析任务)为例,来定义一个HTMLParser派生类。

在构造这个派生类之前,肯定要分析网页的源码的,找出你要获取的那一个值,在此不做介绍。直接上代码了,要仔细理解

#coding=utf-8
import HTMLParser
import requests
class MyHTMLParser(HTMLParser.HTMLParser):
    """

    """
    def __init__(self):
        HTMLParser.HTMLParser.__init__(self)
        self.result = []#记录结果
        self.flag = False#标记


    def handle_starttag(self,tag,attrs):
        if tag == "td" and self.flag == False and len(attrs) == 0:
        #attrs(属性,值)元组(tuple)的列表(list),由于我要获取的值的html标签的没有属性
        #所以要求它长度0以排除其它有属性的标签,缩小获取结果的范围。
        #如果有属性的话,attrs不会为空,它是元组列表可以用条件语句来判断
            self.flag = True

    def handle_end(self,tag):
        if tag == "td" and self.flag == True:
            self.flag = False

    def handle_data(self, data):
        if self.flag == True:
            self.result.append(data)

上面代码不难理解,都是重载HTMLParser类里的方法。

再接着就是爬取网页了,获取数据,代码如下:

def _filter_string(string):
    """
    除去字符串中的空格,换行等等
    由于网页源码中空格、换行符等会使返回的结果中带有换行符(\t)等,所以在此除去,
    其实也可以得到结果(返回的结果是个列表)后用列表的内建方法除去这些带有换行符的元素,
    其实这样用‘+’拼接字符串的效率很低,这个问题我也是刚刚发现,过段时间在研究一下,
    找到了好的方法,再跟大家分享下。
    """
    s = ''
    for one in string:
        if one != '\n' and one != '\r' and one != '\t' and one != ' ':
            s = s + one
    return s
    
def get_rate():
    """
    获取汇率
    Returns:

    """
    url = "Http://srh.bankofchina.com/search/whpj/search.jsp"
    headers = {'user-agent':'Mozilla/5.0 (X11; ubuntulinux x86_64; rv:46.0) Gecko/20100101 Firefox/46.0'}
    usd_data = {
                 'pjname':1316,#美元在中国银行官网的代码
                }
    hkd_data = {
                 'pjname':1315,#港币在中国银行官网的代码
                 }
    usd_result = requests.post(url, data=usd_data, headers=headers)
    hkd_result = requests.post(url, data=hkd_data, headers=headers)
    usd_parser = MyHTMLParser()
    hkd_parser = MyHTMLParser()
    usd_text = usd_result.text
    hkd_text = hkd_result.text
    # text = _filter_string(text)
    usd_text = _filter_string(usd_text)
    hkd_text = _filter_string(hkd_text)

    usd_parser.feed(usd_text)
    usd_parser.close()
    # print usd_result.text
    hkd_parser.feed(hkd_text)
    hkd_parser.close()
    usd_start = usd_parser.result.index(u"美元")  # 美元第一个出现的位置是最新值
    usd_rate = usd_parser.result[usd_start + 3]
    usd_rate = float(usd_rate) / 100  # 最新美元汇率
    usd_uptime = usd_parser.result[usd_start + 7]  # 发布时间
    hkd_start = hkd_parser.result.index(u"港币")
    hkd_rate = hkd_parser.result[hkd_start + 3]
    hkd_rate = float(hkd_rate) / 100
    hkd_uptime = hkd_parser.result[hkd_start + 7]  # 发布时间
    return usd_rate, usd_uptime, hkd_rate, hkd_uptime

HTMLParser类的其它一些方法:

HTMLParser.reset()

重置该实例。失去所有未处理的数据。这个在实例化对象时被隐含地调用。

HTMLParser.feed(data)

提供一些文本给解析器。在由完整元素组成的限度内进行处理,不完整的数据被缓冲直到更多的数据提供或者close()被调用。

HTMLParser.close()

强制将所有的缓冲数据按跟在结束标记的数据一样进行处理。该方法可以通过派生类定义对输入结尾的额外处理来进行重定义,但是重定义的版本应该总是调用HTMLParser基类方法close()

HTMLParser.getpos()

返回当前行数和位移值。

HTMLParser.get_starttag_text()

返回当前位置最近的开始标签的内容

这是给公司内部财务人员记账用的,所以做成了api供调用。隐约感觉上面代码最后几行获取结果的方法不是最佳方法,如果你有更好的方法,欢迎您与我分享,如果我找到了更好的我会及时分享给大家。

当然,如果是个简单的任务,用HTMLParser模块抓取一些想要的数据还是绰绰有余,如果是复杂的任务,有一定要求(比如性能要求)的任务,那就要用第三方库,比如Beautiful Soup,不过这个库我没用过,有时间研究一下,然后再和大家分享一下我的学习习得。

--结束END--

本文标题: Python:HTMLParser模块进

本文链接: https://lsjlt.com/news/186761.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Python:HTMLParser模块进
        这是从用Python开发开始到现在第二次使用HTMLParser模块进行html解析了,第一次用的时候,由于是刚刚接触Python,对其中的一些用法不是很理解,因为赶进度,虽然照着参考资料也写出来了,但是其中的原理还是不怎么了解。第...
    99+
    2023-01-31
    模块 Python HTMLParser
  • subprocess—Python多进程模块
    subprocess—Python多进程模块 1.概述 这篇文章介绍并行运算中的subprocess模块,subprocess 模块允许我们启动一个新进程,并连接到它们的输入/输出/错误管道,从而获取...
    99+
    2023-09-03
    python linux 运维
  • python子进程模块subproce
    属性1.Popen.poll():用于检查子进程是否已经结束。设置并返回returncode属性。2.Popen.wait():等待子进程结束。设置并返回returncode属性。3.Popen.communicate(input=None...
    99+
    2023-01-31
    模块 进程 python
  • pythonMultiprocessing.Pool进程池模块详解
    目录前言实例方法前言 Multiprocessing.Pool可以提供指定数量的进程供用户调用,当有新的请求提交到pool中时,如果池还没有满,那么就会创建一个新的进程用来执行该请求...
    99+
    2024-04-02
  • ES6 模块的进阶之路:解锁高级模块化技巧
    ES6 模块化系统通过将代码组织成可重用块,带来了 JavaScript 编程的新维度。虽然掌握了模块的基础知识很重要,但要驾驭 ES6 模块的真正力量,需要探索其高级技术,包括动态导入、循环依赖管理和树形摇动。 动态导入 动态导入允许...
    99+
    2024-03-02
    ES6 模块、模块化、动态导入、循环依赖、树形摇动
  • YOLOV8改进:如何增加注意力模块?(以CBAM模块为例)
    YOLOV8改进:如何增加注意力模块?(以CBAM模块为例) 前言YOLOV8nn文件夹modules.pytask.py models文件夹总结 前言 因为毕设用到了Y...
    99+
    2023-09-01
    YOLO 深度学习 python
  • Python模块:time模块
    time模块:python中处理时间的基础模块,有时间戳,元组,自定义,三种时间表现形式。python中时间戳的值是以1970年1月1日0点开始计算的,单位是秒。时间戳:就是两个时间差的数值。时区:传说中在开发服务器/客户端程序时,时区不一...
    99+
    2023-01-31
    模块 Python time
  • python模块:smtplib模块
    1.使用本地的sendmail协议进行邮件发送格式(1):smtpObj=smtplib.SMTP([host [,port [,local_hostname]]])host:SMTP服务器主机的IP地址或者是域名port:服务的端口号(默...
    99+
    2023-01-31
    模块 python smtplib
  • 【Python】Python的urllib模块、urllib2模块批量进行网页下载文件
    由于需要从某个网页上下载一些PDF文件,但是需要下载的PDF文件有几百个,所以不可能用人工点击来下载。正好Python有相关的模块,所以写了个程序来进行PDF文件的下载,顺便熟悉了Python的urllib...
    99+
    2022-06-04
    模块 批量 文件
  • JavaScript模块化:模块化的进化史,从混沌到井然有序
    1. 早期模块化(ES 模块之前) 在 ES 模块出现之前,开发人员采用各种非标准化的方法来实现模块化。这些方法包括: 闭包:使用立即调用的函数表达式(IIFE)来创建私有变量和函数。 命名空间:使用对象或函数来组织和封装相关代码。 模...
    99+
    2024-04-02
  • Nodejs进程管理模块forever详解
    接下来,就让我们看看forever能不能实现目标。一、forever介绍 forever是一个简单的命令式nodejs的守护进程,能够启动,停止,重启App应用。forever完全基于命令行操作,在fore...
    99+
    2022-06-04
    详解 进程 管理模块
  • Python中的进程操作模块(multiprocess.process)
    目录一、multiprocess模块二、multiprocess.process模块1、使用process模块创建进程1 在Python中启动的第一个子进程2、 查看主进程和子进程的...
    99+
    2024-04-02
  • 使用wml进行npm模块调试
    要使用 wml 进行 npm 模块调试,您需要按照以下步骤操作:1. 首先,确保您已经在本地安装了 Node.js 和 npm。2....
    99+
    2023-09-21
    npm模块
  • python3--中的进程操作--multiprocess模块
    在python程序中的进程操作运行中的程序就是一个进程。所有的进程都是通过它的父进程来创建的。因此,运行起来的python程序也是一个进程,那么我们也可以在程序中再创建进程。多个进程可以实现并发效果,也就是说,当我们的程序中存在多个进程的时...
    99+
    2023-01-30
    模块 进程 操作
  • Python模块整理(六):守护进程
    守护进程三个特征:在后台运行,与启动它的进程脱离,无须控制终端。 >>> def run(program, *args): ...     pid = os.fork() ...     if...
    99+
    2023-01-31
    模块 进程 Python
  • Python模块整理(五):多进程mul
    线程共享全局状态,进程完全独立。线程局限在一个处理器,线程可以发挥多个处理器的资源. 没有找到processing模块只找到multiprocessing #!/usr/bin/env python from ...
    99+
    2023-01-31
    模块 进程 Python
  • 常用模块 - configparse模块
    一、简介 configparser模块在Python中是用来读取配置文件的,配置文件的格式跟windows下的ini配置文件相似,可以包含一个或多个节点(section),每个节可以有多个参数(键=值)。 二、生成配置文件 #! /us...
    99+
    2023-01-31
    模块 常用 configparse
  • 常用模块 - openpyxl模块
    一、简介 xlrd/xlwt          主要是针对Office 2003或更早版本的XLS文件格式          缺点:不支持XLSX文件格式 OpenPyXL          能读能写能修改          缺点:不支持...
    99+
    2023-01-31
    模块 常用 openpyxl
  • 常用模块 - hashlib模块
    一、简介 Python的hashlib提供了常见的摘要算法,如MD5、SHA1、SHA224、SHA256、SHA384、SHA512等算法。 什么是摘要算法呢?摘要算法又称哈希算法、散列算法。它通过一个函数,把任意长度的数据转换为一个长...
    99+
    2023-01-31
    模块 常用 hashlib
  • python常见模块之OS模块和time模块
    一、OS模块概述 Python OS模块包含普遍的操作系统功能。如果你希望你的程序能够与平台无关的话,这个模块是尤为重要的。 二、常用方法 三、OS模...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作