两个月多没写代码,这两天为了下载个500集的豆单,并把flv转化为mp3

第一,利用http://www.flvcd.com/,输入豆单地址,解析豆单的flv地址flvUrlParse.htm
第二,利用Internet Download Manager,解析flvUrlParse.htm,下载到
F:/download/flv/
第三,转化为Mp3
第四,正则提取flvUrlPasrse.htm,把转换后的mp3名字整理。

结果本来很简单的东西,却写了两天多。。。。
在好几个sb的错误上花费了很多时间:

  1. while(fin.good()&&!fin.eof()){
  2.         fin.getline(szBuffer,LEN);

上面代码是死循环。。。。
直接判断fin.getline的返回值即可。
然后,利用boost的xpressive做正则

  1. sregex rex = sregex::compile( "<td [^>]*><a href=\"([^\"]*/(\\d*).flv?[^\"]*)\"[^>]*>([^>]*)</a></td>");
  2.  
  3.     int const subs[] = { 1 ,2 ,3};
  4.     sregex_token_iterator cur( strBuffer.begin(), strBuffer.end(), rex, subs );
  5.     sregex_token_iterator end;
  6.  
  7.     for( ; cur != end; ++cur )
  8.     {
  9.         std::cout << *cur << endl;
  10.         //getchar();
  11.     }

subs 是获取的匹配
0为全匹配串
-1为未匹配串
1,2,3依次为子匹配串

boost库的xpressive确实强大,唯一的缺点就是模板的编译时间太长了,引入xpressive后,编译有3秒直接飙升到了1分钟多。就算添加了预编译头,还需要近20秒,不过实话说,预编译头还是有作用的

后来想想,编译代价太大了,改用python来写。。。。。
然后,悲剧又开始了

  1. if __name__ == "main":

….第一起悲剧,然后

  1. os.remove(flvFilename);

抛出WindowsError: [Error 2] 。。。。
开始以为是中文文件名的问题,字符编码集改来改去。未成功。才想起来以前写过类似删文件的代码,过去以看,才意识到,需要判断文件是否存在,不存在会抛出异常-__-!!!

手生了很多啊。。

  1. # -*- coding: utf-8 -*-
  2.  
  3. import os.path;
  4. import glob;
  5. import sys;
  6. import re;
  7.  
  8. flvdir = u"f:/download/莆仙戏";
  9. mp3dir = u"f:/download/莆仙戏/mp3";
  10. html = u"F:/tmp/parse.php.htm";
  11. ff = os.path.join(mp3dir,"*.mp3");
  12. regexPattern = "<td.*?.*?>.*?(\d*):</td>\s*<td.*?><a href=\"([^\"]*/(\\d*)\.flv\?[^\"]*)\".*?>.*?-([^>]*)</a></td>";
  13. flvMap = {};
  14.  
  15. def doClean():
  16.     print u"删除已经存在的文件...."
  17.     for file in glob.glob(ff):
  18.         baseFilename = os.path.basename(file);
  19.         baseFilename = os.path.splitext(baseFilename);
  20.         flvFilename = os.path.join(flvdir,baseFilename[0]+".flv");
  21.         print flvFilename;
  22.         try:
  23.             os.remove(flvFilename);
  24.         except:
  25.             pass;
  26.  
  27. def loadHtml():
  28.     print u"构建名字树...."
  29.     fin = open(html);
  30.     htmlContent = "".join(fin.readlines());
  31.     regex = re.compile(regexPattern,re.IGNORECASE);
  32.     result = regex.findall(htmlContent,re.M);
  33.     if(result):
  34.         for item in result:
  35.             flvMap[ item[2] ]= {"no":item[0],
  36.                     "href":item[1],
  37.                     "title":item[3]};
  38.     for key in flvMap.keys():
  39.         print getFormatTitle(key);
  40.  
  41. def getFormatTitle(key):
  42.     if key in flvMap:
  43.         result = "%03d.%s" % (
  44.                 int( flvMap[key]["no"] ),
  45.                 flvMap[key]["title"]);
  46.         #str -->unicode need docode fuction
  47.         return result.decode("gbk")
  48.     else:
  49.         print "error@no such key:" + key;
  50.  
  51. def rename():
  52.     for file in glob.glob(ff):
  53.         baseFilename = os.path.basename(file);
  54.         baseFilename = os.path.splitext(baseFilename);
  55.         newBaseName = getFormatTitle(baseFilename[0]);
  56.         print newBaseName;
  57.         if(newBaseName):
  58.            
  59.             newName = os.path.join(mp3dir,newBaseName + baseFilename[1] );
  60.             os.rename(file,newName);
  61.             #ren = "rename "+file +" ---> " + newName;
  62.             #print unicode(ren);
  63.  
  64. def reanmeAg():
  65.     reg = "(.*)\\\\(\\d*?)\\.(.*)";
  66.     reg = re.compile(reg,re.IGNORECASE);
  67.     for file in glob.glob(ff):
  68.         result = reg.search(file);
  69.         newFilename = u"%s/%03d.%s" % (
  70.                 result.group(1) ,
  71.                 int( result.group(2) ),
  72.                 result.group(3));
  73.         os.rename(file,newFilename);
  74.  
  75. if __name__ == "__main__":
  76.     doClean();
  77.     loadHtml();
  78.     rename();
  79.     reanmeAg();

No related posts.