html文件在unix打开,1.25 将HTML文档转化为文本显示到UNIX终端上

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

感谢:Brent Burley、Mark Moraes

任务

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

更多资料

Library Reference和Python in a Nutshell文档中关于formatter和htmllib模块的内容;在UNIX或者类UNIX系统中用man命令查看tput命令的有关信息。

【责任编辑:云霞 TEL:(010)68476606】

点赞 0

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值