回顾在《Python进阶记录之urllib模块》中 , 我们介绍了Python内置的HTTP请求库urllib模块的基本用法 , 需要重点掌握使用urllib的request模块进行简单的get、post请求 。今天我们讲一下Python内置的html解析库HTMLParser模块 , 并结合之前的re模块和urllib模块实现爬取指定新闻页提取新闻文本内容的小需求 。
HTMLParser模块简介我们使用urllib模块进行HTTP请求获取到的是整个网页的HTML , 但是我们往往只需要其中一部分对我们有用的内容 。这时我们就可以使用HTMLParser模块来帮助我们处理HTML 。
HTMLParser是Python内置的专门用来解析HTML的模块 。利用HTMLParser , 我们可以分析出一段HTML里面的标签、数据等 , 是一种处理HTML的简便途径 。我们先来看一个官方的例子 。
文章插图
HTMLParser模块官方例子
从上述代码中可以看出 , HTMLParser模块来自html.parser , 导包时要格外注意 。使用HTMLParser时 , 我们需要定义一个继承自HTMLParser的子类 , 并根据需要重写HTMLParser父类中的成员方法 。例子中使用的各方法作用如下:
handle_starttag(tag, attrs):识别HTML的开始标签 , 例如<html>、<title>、<body>、<div>等 。
handle_endtag(tag):识别HTML的结束标签 , 例如</html>、</body>、</div>、</p>等 。
handle_data(data):识别HTML标签内容 , 例如“<p>Test</p>”中的Test 。
handle_startendtag(tag, attrs):识别没有结束标签的HTML标签 , 例如<img />等 。
handle_comment(data):识别HTML中的注释内容 , 一般是“<!-- 注释 -->”中的注释内容 。
HTMLParser采用的是一种事件驱动的模式 , HTMLParser找到一个特定的标记时 , 它会去调用一个用户定义的函数 , 以此来通知程序处理 。
我们可以利用这些方法来实现HTML解析相关的功能 。其中参数tag表示的是HTML标签 , attrs是一个列表 , 列表元素为一个个“(属性 , 值)”形式的元组 。HTMLParser会自动将tag和attrs都转为小写 , 解析时调用feed( )方法 , 把待解析的HTML字符串传入即可 。
HTMLParser模块的简单应用现在有以下网页 , 我们需要获取出里面的新闻文本内容 。
文章插图
待请求网页
首先就是获取该网页的HTML 。经过上节内容的学习 , 我们很容易想到利用urllib库请求获取这个网页的HTML 。
文章插图
获取网页HTML
代码很简单 , 使用urlopen( )方法 , 传入url即可 。此时 , 我们已经得到了整个网页的HTML , 但是我们要获取的是新闻内容 , 显然此时的HTML中有太多我们不需要的东西 。
观察整个网页HTML , 我们发现新闻内容是包含在一个div中的 。
文章插图
新闻内容相关HTML
我们可以使用正则表达式re模块将包含新闻内容的这个div提取出来 。
文章插图
提取新闻内容相关的HTML
新闻内容的div格式主要是:<div class="article-content">...</div> 。由于该div下嵌套了其他div , 如果我们直接使用r'<div class="article-content">(.*?)</div>'进行正则提取 , 会发现在下一个</div>处就截断了 。为了正确提取所有新闻内容相关的HTML , 我们需要在</div>前加一个</p> , 以保证是在新闻内容结束的</div>处截断 。
此时 , 我们已经得到了新闻内容相关的HTML 。现在还剩最后一部 , 就是把HTML标签去掉 , 保留新闻文本内容 。这一步 , 我们就可以利用HTMLParser来实现了 。
文章插图
HTMLParser提取新闻内容
我们定义一个继承自HTMLParser的子类 , 然后重写handle_data(data)方法获取当前HTML中的文本内容即可 。由于我们定义的私有变量__text是通过一个列表来逐条接收新闻内容的 , 所以我们在类中定义一个获取私有变量__text的方法 , 并将列表转换成字符串 。至此 , 我们已经获取到了新闻的文本内容 。
推荐阅读
- Python爬虫案例,腾讯动漫爬虫,步骤超详细解释,源码分析
- Faust - 简洁高效的 Python 流处理库
- Python虚拟环境实用指南
- Python爬取下载m3u8加密视频,原来这么简单
- 人类最长不吃饭记录?世界上不用吃饭的人
- 五步掌握用VSCode进行高效Python开发
- Python开发必备:如何建立一个完美的项目工程环境
- Python 语言基础变量获得变量类型
- Python线上环境如何优雅地使用日志?
- Windows Python 命令行如何退出