《Python Cookbook(第2版)中文版》——1.25 将HTML文档转化为文本显示到UNIX终端上

简介:

本节书摘来自异步社区《Python Cookbook(第2版)中文版》一书中的第1章,第1.25节,作者[美]Alex Martelli , Anna Martelli Ravenscrof , David Ascher ,高铁军 译,更多章节内容可以访问云栖社区“异步社区”公众号查看。

1.25 将HTML文档转化为文本显示到UNIX终端上

任务

需要将HTML文档中的文本展示在UNIX终端上,同时还要支持粗体和下划线的显示。

解决方案

最简单的方法是写一个过滤的脚本,从标准输入接收HTML,将输出文本和终端控制序列打印到标准的输出上。由于本节的问题只针对UNIX,我们可以借助Python标准库的os模块提供的popen函数,通过UNIX的命令tput获取所需的终端控制序列:

#!/usr/bin/env python
import sys, os, htmllib, formatter
# 使用UNIX的tput来获得粗体、下划线和重设的转义序列
set_bold = os.popen('tput bold').read( )
set_underline = os.popen('tput smul').read( )
perform_reset = os.popen('tput sgr0').read( )
class TtyFormatter(formatter.AbstractFormatter):
     ''' 一个保留粗体和斜体状态的格式化对象,并输出
           相应的终端控制序列
     '''
     def _ _init_ _(self, writer):
           # 首先,像往常一样,初始化超类
           formatter.AbstractFormatter._ _init_ _(self, writer)
           # 一开始既没有粗体也没有斜体状态,未保存任何信息
           self.fontState = False, False
           self.fontStack = [  ]
     def push_font(self, font):
           # font元组有4项,我们只看与粗体和斜体的状态
           # 有关的两个标志
           size, is_italic, is_bold, is_tt = font
           self.fontStack.append((is_italic, is_bold))
           self._updateFontState( )
     def pop_font(self, *args):
           # 回到前一个font状态
           try:
                self.fontStack.pop( )
           except IndexError:
                pass
           self._updateFontState( )
     def updateFontState(self):
           # 输出正确的终端控制序列,如果粗体和/或斜体(==underline)
           # 的状态被刚刚改变的话
           try:
                newState = self.fontStack[-1]
           except IndexError:
                newState = False, False
           if self.fontState != newState:
                # 相关的状态改变:重置终端
                print perform_reset,
                # 如果需要的话,设置下划线与/或粗体状态
                if newState[0]:
                      print set_underline,
                if newState[1]:
                      print set_bold,
                # 记住当前的两个状态
                self.fontState = newState
# 生成写入、格式化、解析对象,根据需要将它们连接起来
myWriter = formatter.DumbWriter( )
if sys.stdout.isatty( ):
       myFormatter = TtyFormatter(myWriter)
else:
       myFormatter = formatter.AbstractFormatter(myWriter)
myParser = htmllib.HTMLParser(myFormatter)
# 将标准输入和终端操作提供给解析器
myParser.feed(sys.stdin.read( ))
myParser.close( )

讨论

Python标准库提供的formatter.AbstractFormatter类,可以在任何场合工作。另一方面,它的子类TtyFormatter提供的一些改良,则主要是为了操纵和使用类UNIX(UNIX-like)终端,具体地说,也就是通过UNIX命令tput获取控制粗体和下划线的转义序列,并将终端重置为基本状态。

很多系统并没有通过UNIX认证,比如Linux和Mac OS X,但它们也提供了一个可用的tput命令,因此本节的TtyFormatter子类在这样的系统中仍然可以正常工作。或者这么说,可以用更宽泛的眼光来看待本节提及的“UNIX”,就好像我们在一些其他讨论中所用的“UNIX”概念:如果你愿意,可以认为它指的是“*ix”。

如果你的“终端”模拟器支持其他的一些控制输出表现的转义序列,也可以根据情况修改TtyFormatter类。比如,据说在Windows中,cmd.exe命令能够支持所有标准的ANSI转义序列,所以如果你只想在Windows上运行你的脚本,可以用硬编码的方式在类中写入那些序列。

很多时候,你可能会更喜欢用UNIX已经提供的命令,比如lynx -dump -,相比于本节方案中提供的方法,这些命令能够提供更丰富更具表现力的输出。但有时你会发现Python安装在一个不提供这种有用的命令(如lynx)的系统上,那么本节给出的方法就显得很方便和简洁了。

相关文章
|
2月前
|
数据采集 Python
Python实用记录(七):通过retinaface对CASIA-WebFace人脸数据集进行清洗,并把错误图路径放入txt文档
使用RetinaFace模型对CASIA-WebFace人脸数据集进行清洗,并将无法检测到人脸的图片路径记录到txt文档中。
50 1
|
2月前
|
Python
Python实用记录(六):如何打开txt文档并删除指定绝对路径下图片
这篇文章介绍了如何使用Python打开txt文档,删除文档中指定路径的图片,并提供了一段示例代码来展示这一过程。
37 1
|
16天前
|
移动开发 前端开发 JavaScript
HTML(HyperText Markup Language,超文本标记语言)
HTML(HyperText Markup Language,超文本标记语言)
67 11
|
30天前
|
XML 数据采集 数据格式
Python 爬虫必备杀器,xpath 解析 HTML
【11月更文挑战第17天】XPath 是一种用于在 XML 和 HTML 文档中定位节点的语言,通过路径表达式选取节点或节点集。它不仅适用于 XML,也广泛应用于 HTML 解析。基本语法包括标签名、属性、层级关系等的选择,如 `//p` 选择所有段落标签,`//a[@href='example.com']` 选择特定链接。在 Python 中,常用 lxml 库结合 XPath 进行网页数据抓取,支持高效解析与复杂信息提取。高级技巧涵盖轴的使用和函数应用,如 `contains()` 用于模糊匹配。
|
24天前
|
机器学习/深度学习 前端开发 数据处理
利用Python将Excel快速转换成HTML
本文介绍如何使用Python将Excel文件快速转换成HTML格式,以便在网页上展示或进行进一步的数据处理。通过pandas库,你可以轻松读取Excel文件并将其转换为HTML表格,最后保存为HTML文件。文中提供了详细的代码示例和注意事项,帮助你顺利完成这一任务。
35 0
|
1月前
|
机器学习/深度学习 自然语言处理 API
如何使用阿里云的语音合成服务(TTS)将文本转换为语音?本文详细介绍了从注册账号、获取密钥到编写Python代码调用TTS服务的全过程
如何使用阿里云的语音合成服务(TTS)将文本转换为语音?本文详细介绍了从注册账号、获取密钥到编写Python代码调用TTS服务的全过程。通过简单的代码示例,展示如何将文本转换为自然流畅的语音,适用于有声阅读、智能客服等场景。
307 3
|
2月前
|
数据处理 Python
Python实用记录(十):获取excel数据并通过列表的形式保存为txt文档、xlsx文档、csv文档
这篇文章介绍了如何使用Python读取Excel文件中的数据,处理后将其保存为txt、xlsx和csv格式的文件。
128 3
Python实用记录(十):获取excel数据并通过列表的形式保存为txt文档、xlsx文档、csv文档
|
2月前
|
计算机视觉 Python
Python实用记录(九):将不同的图绘制在一起、将不同txt文档中的数据绘制多条折线图
这篇文章介绍了如何使用Python的OpenCV库将多张图片合并为一张图片显示,以及如何使用matplotlib库从不同txt文档中读取数据并绘制多条折线图。
54 3
Python实用记录(九):将不同的图绘制在一起、将不同txt文档中的数据绘制多条折线图
|
1月前
|
XML JavaScript 前端开发
如何解析一个 HTML 文本
【10月更文挑战第23天】在实际应用中,根据具体的需求和场景,我们可以灵活选择解析方法,并结合其他相关技术来实现高效、准确的 HTML 解析。随着网页技术的不断发展,解析 HTML 文本的方法也在不断更新和完善,
|
2月前
|
XML 前端开发 数据格式
Beautiful Soup 解析html | python小知识
在数据驱动的时代,网页数据是非常宝贵的资源。很多时候我们需要从网页上提取数据,进行分析和处理。Beautiful Soup 是一个非常流行的 Python 库,可以帮助我们轻松地解析和提取网页中的数据。本文将详细介绍 Beautiful Soup 的基础知识和常用操作,帮助初学者快速入门和精通这一强大的工具。【10月更文挑战第11天】
81 2