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

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)的系统上,那么本节给出的方法就显得很方便和简洁了。

时间: 2024-08-30 13:47:37

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

如何在win7旗舰版系统中清除索引记录文档?

  想必大家都知道,在咱们的win7 64位旗舰版的开始菜单中,是有一个搜索功能的,需要在咱们的win7旗舰版电脑中搜索文件或者是程序的朋友,很多都曾经使用过这个功能,但是大家可能不知道的是,win7旗舰版系统中的这个搜索功能会在C盘自动建立索引记录文档,而这些文档会占用大量的C盘空间,对于系统盘空间本身就不足的win7旗舰版系统来说,这无疑是一个致命伤,那么咱们如何才能将这个索引记录文档清除掉,扩大咱们win7旗舰版电脑的系统盘空间呢?下面,小编就来详细的介绍一下吧! 1.如果大家平时不需要使

《Python Cookbook(第2版)中文版》——导读

前 言 这本书不是一本典型的O'Reilly风格的书,而是一本集合了多个作者的手稿的作品.实际上,这也是一种将开源开发的方式应用到书籍出版业的尝试.Python社区有超过300个成员在本书中贡献了他们的心得和资料.在这里,我们作为编辑,想给你--本书的读者,介绍一些重要的背景资料,这些背景资料是关于此书是如何编著出来,以及这个过程和涉及的人,并提出一些关于这种崭新的风格的思考. 目 录 [第1章 文本1.1 每次处理一个字符](https://yq.aliyun.com/articles/963

用python + openpyxl处理excel2007文档思路以及心得_python

寻觅工具 确定任务之后第一步就是找个趁手的库来干活. Python Excel上列出了xlrd.xlwt.xlutils这几个包,但是 它们都比较老,xlwt甚至不支持07版以后的excel 它们的文档不太友好,都可能需要去读源代码,而老姐的任务比较紧,加上我当时在期末,没有这个时间细读源代码 再一番搜索后我找到了openpyxl,支持07+的excel,一直有人在维护,文档清晰易读,参照Tutorial和API文档很快就能上手,就是它了~ 安装 这个很容易,直接pip install open

《Adobe Fireworks CS6中文版经典教程》——1.5使用多个文档

1.5使用多个文档 Adobe Fireworks CS6中文版经典教程结束本课前,再介绍一下Fireworks CS6的文档窗口功能.Fireworks有多种方式可访问打开的文档窗口,了解如何自定义访问,如在文件间拖动对象,可使工作流更流畅.当打开了多个文件时,文件的文档窗口将以选项卡方式排列,让用户能够轻松地访问. 1.选择菜单"文件">"打开",并切换到配套光盘中的文件夹Lesson 01中. 2.按住Ctrl(Windows)或Command(Mac)

Python文档生成工具pydoc使用介绍

  这篇文章主要介绍了Python文档生成工具pydoc使用介绍,本文讲解了基本用法.获取帮助的方法.生成的文档效果图等内容,需要的朋友可以参考下 在Python中有很多很好的工具来生成字符串文档(docstring),比如说: epydoc.doxygen.sphinx,但始终觉得pydoc还是不错的工具,用法非常简单,功能也算不错,本文主要介绍pydoc. pydoc是Python自带的模块,主要用于从python模块中自动生成文档,这些文档可以基于文本呈现的.也可以生成WEB 页面的,还可

WPS移动版新功能实现多文档随意切换 工作效率翻倍

多标签功能大家应该并不陌生,很多浏览器都使用了这种设计,不仅节省资源占用,更便于使用过程中在多个网页见切换.同样,在平板.手机等移动设备上,屏幕空间有限,只能依靠手指触摸来操作,因此,WPS移动版推出了多文档切换功能. 在Office文档处理中,经常需要通过对比多个文档来完成工作任务.所以多文档切换功能就变得至关重要.这是WPS移动版在同类软件中率先推出的功能.文字.表格.演示.PDF,多个文档同时打开并轻松切换,将为你在平板上处理工作增色不少. 操作过程并不复杂,下面将三种操作方法分享给大家:

如何将win7旗舰版电脑“我的文档”文件存放位置还原

  1.首先,咱们需要在win7旗舰版电脑中找到"我的文档"图标,一般来说,这个图标是不在win7旗舰版电脑的桌面位置的,咱们只需要双击桌面的计算机图标,进入到win7旗舰版的资源管理器窗口之后,咱们就可以在弹出窗口左侧菜单中找到文档图标了,咱们右键点击这个文档,然后在下滑菜单中选择属性. 2.在打开的文件夹属性窗口中,咱们将界面切换到位置这一栏中,然后点击窗口下方的"还原默认值"按钮就可以了.设置好之后,大家不要忘记点击确定保存设置哦.

《Adobe Acrobat X中文版经典教程》—第1章1.8节设计供在线阅读的文档

1.8 设计供在线阅读的文档 Adobe Acrobat X中文版经典教程 如果预期文档将被在线查看,需要做出有助于出版物引人入胜和易于使用的设计和出版决策.如果只想将纸质文档转换为电子格式,需要在重新设计带来的好处与其所需的时间和费用之间进行权衡.如果出版物需要在屏幕上阅读和作为印刷品发行,需要在设计中考虑这两种不同的需求. 首先来看一个打印的文档,该文档被转换为电子格式,但未作任何修改.将文档转换为Adobe PDF,可以方便地传播它,且费用低廉.同时,可以使用诸如链接和书签等功能,使得导览

《iOS 6高级开发手册(第4版)》——2.7节秘诀:使用文档交互控制器

2.7 秘诀:使用文档交互控制器 iOS 6高级开发手册(第4版) UIDocumentInteractionController类允许应用程序给用户展示一个选项菜单,允许他们以各种方式使用文档文件,利用这个类,用户可以利用以下特性. iOS应用程序之间的文档共享(即"在某个应用程序中打开这个文档"). 使用QuickLook进行文档预览. 活动控制器选项,比如打印.共享和社交网络. 你已经在本章前面的动作中见过后两种特性.文档交互类在这些特性顶部添加了应用程序间的共享,如图2-7所示