Python 3.1 已经发布了。兴冲冲地将陪伴了我多年的 2.X 版本卸载了,安装上 Python 3.1。结果一些旧 Py 脚本无法正常运行。其原因是 Python 3.1 并不与 2.X 相兼容。看来在日新月异的今天,保持“兼容性”与追求“创新性”间的矛盾越来越大了。理解理解,不妨将旧程序的移植作为学习的动力。
IBM DevelopWorks 中国网站上有一组介绍 Python 3 的入门文章,由此进入
2009年3月18日星期三
2007年9月2日星期日
用Python来分析《新东方背单词》的录入格式
我想使用《新东方背单词》来背一些自己浏览文章时遇到的生词。该软件提供了一个建立自己图书并从文本格式文件批量录入的功能,但在帮助中没有提供详细的格式说明。于是我用Python编写了一个简单程序来生成测试文本,找到其中规则。代码如下:
生成的文件录入《新东方背单词》后显示对应的格式,从而得到格式定义符如下:
# Recite words
sl = []
sll = []
for i in range(26):
sl.append( chr( ord('a') + i ) )
for i in sl:
for j in sl:
sll.append( i + j )
f = open('recite.txt','w+')
f.write('w \n')
for i in sl :
if i <> 'w' :
f.write( '<' + i + '>' + i + '\n' )
f.close()
f = open('recite1.txt','w+')
f.write('ww \n')
for i in sll:
f.write('<' + i + '>' + i + '\n' )
f.close()
生成的文件录入《新东方背单词》后显示对应的格式,从而得到格式定义符如下:
w--单词
c--中文解释
e--英文解释
d--短语
p--音标
f--词频
k--考点
h--助记法
s--同义词
a--反义词
o--其它
ee--例句
2007年7月1日星期日
python过滤HTML代码小记
我常用Python来过滤HTML代码,其中一项工作是将网络上批量下载的文章进行重命名。一般操作是先下载索引页面(HTML),然后用FlashGet批量下载文件;用Python过滤索引页面以获取文件下载名与实际文件名的对应列表,最后转换为BAT文件批处理。
但我一直没有能解决如何判断A标签的class属性问题,因为我以前的代码是:
def start_a(self,attrs):
idText = [ v for k, v in attrs if k == 'class' ]
fileHref = [ v for k, v in attrs if k == 'href' ]
print fileHref
if idText == 'a': #这里判断class的属性,有问题的
self.inValid = True
self.fileHrefs.append( fileHref )
def end_a(self):
self.inValid = False
其中判断A标签的class属性那段是有问题的。原因是我没有区分Python中数组与字符串的关系。今天我重读Python帮助后才意识到这一点。我的新代码如下:
def start_a(self,attrs):
idText = [ v for k, v in attrs if k == 'class' ]
fileHref = [ v for k, v in attrs if k == 'href' ]
print fileHref
if idText == ['a'] : #用数组来判断
self.inValid = True
self.fileHrefs.append( fileHref [0]) #在序列数组中添加字符串而非子序列数组
def end_a(self):
self.inValid = False
这样就解决问题了。
但我一直没有能解决如何判断A标签的class属性问题,因为我以前的代码是:
def start_a(self,attrs):
idText = [ v for k, v in attrs if k == 'class' ]
fileHref = [ v for k, v in attrs if k == 'href' ]
print fileHref
if idText == 'a': #这里判断class的属性,有问题的
self.inValid = True
self.fileHrefs.append( fileHref )
def end_a(self):
self.inValid = False
其中判断A标签的class属性那段是有问题的。原因是我没有区分Python中数组与字符串的关系。今天我重读Python帮助后才意识到这一点。我的新代码如下:
def start_a(self,attrs):
idText = [ v for k, v in attrs if k == 'class' ]
fileHref = [ v for k, v in attrs if k == 'href' ]
print fileHref
if idText == ['a'] : #用数组来判断
self.inValid = True
self.fileHrefs.append( fileHref [0]) #在序列数组中添加字符串而非子序列数组
def end_a(self):
self.inValid = False
这样就解决问题了。
2007年6月25日星期一
批量下载后的文件名过滤
用FlashGet批量下载文件后面临一个文件名更改过滤的问题。我的解决方案是:
1.在批量下载时,同时下载该网页的HTML文件;
2.用Python来过滤出对应的HTML文件;
3.将过滤文件修补成Bat文件,运行后则可批量更改名称;
=====================================================================
Python过滤源代码
# -*- coding: cp936 -*-
# yankchina@gmail.com
# 2007-06-26 pass
from sgmllib import SGMLParser
class MyHtmlFilter(SGMLParser):
def reset(self):
SGMLParser.reset(self)
self.inValid = False
self.fileHrefs = []
self.fileNames = []
def start_a(self,attrs):
#idText = [ v for k, v in attrs if k == 'class' ]
fileHref = [ v for k, v in attrs if k == 'href' ]
#if idText == 'a01' :
self.inValid = True
self.fileHrefs.append( fileHref )
def end_a(self):
self.inValid = False
def handle_data(self, text ):
if self.inValid:
self.fileNames.append( text )
def FilteHtmlFile( inFileName,outFile ):
''' Filte Html File
'''
import os
if os.path.exists( inFileName ):
inFile = open( inFileName, "r")
parser = MyHtmlFilter()
parser.feed( inFile.read() )
inFile.close()
parser.close()
print len( parser.fileNames )
for i in range( len( parser.fileNames) ):
outFile.write( parser.fileHrefs[i][0] + " " + parser.fileNames[i]+ ".doc \n " )
print parser.fileNames[i]
print parser.fileHrefs[i]
print inFileName, len( parser.fileHrefs )
if __name__ == "__main__" :
outFileName = 'output.txt'
outFile = open( outFileName, "w" )
htmlFileName = "1.htm"
FilteHtmlFile(htmlFileName, outFile )
outFile.close()
1.在批量下载时,同时下载该网页的HTML文件;
2.用Python来过滤出对应的HTML文件;
3.将过滤文件修补成Bat文件,运行后则可批量更改名称;
=====================================================================
Python过滤源代码
# -*- coding: cp936 -*-
# yankchina@gmail.com
# 2007-06-26 pass
from sgmllib import SGMLParser
class MyHtmlFilter(SGMLParser):
def reset(self):
SGMLParser.reset(self)
self.inValid = False
self.fileHrefs = []
self.fileNames = []
def start_a(self,attrs):
#idText = [ v for k, v in attrs if k == 'class' ]
fileHref = [ v for k, v in attrs if k == 'href' ]
#if idText == 'a01' :
self.inValid = True
self.fileHrefs.append( fileHref )
def end_a(self):
self.inValid = False
def handle_data(self, text ):
if self.inValid:
self.fileNames.append( text )
def FilteHtmlFile( inFileName,outFile ):
''' Filte Html File
'''
import os
if os.path.exists( inFileName ):
inFile = open( inFileName, "r")
parser = MyHtmlFilter()
parser.feed( inFile.read() )
inFile.close()
parser.close()
print len( parser.fileNames )
for i in range( len( parser.fileNames) ):
outFile.write( parser.fileHrefs[i][0] + " " + parser.fileNames[i]+ ".doc \n " )
print parser.fileNames[i]
print parser.fileHrefs[i]
print inFileName, len( parser.fileHrefs )
if __name__ == "__main__" :
outFileName = 'output.txt'
outFile = open( outFileName, "w" )
htmlFileName = "1.htm"
FilteHtmlFile(htmlFileName, outFile )
outFile.close()
订阅:
博文 (Atom)