免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: two
打印 上一主题 下一主题

中央电视台节目单 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2009-08-13 16:06 |只看该作者
有问题:

Traceback (most recent call last):
  File "D:\AppServ\www\cmdpy\jiemu.py", line 35, in <module>
    list2=re.findall(r"<li>(.+?)</li>",list[0],re.S)
IndexError: list index out of range

论坛徽章:
0
12 [报告]
发表于 2009-08-13 19:25 |只看该作者
楼上的和7楼的,可能是你用的python版本太低了吧?试试2.5?

10楼真是有心人呐。呵呵。python challenge 过了几关了?

论坛徽章:
0
13 [报告]
发表于 2009-08-15 00:40 |只看该作者
我的2.6同十一楼问题一样。。。
用7楼的也是不行。。

论坛徽章:
0
14 [报告]
发表于 2009-08-15 08:54 |只看该作者
#! /usr/bin/python
#  coding=gbk
import urllib.request,re,unicodedata,string,sys
import locale
from time import strftime,localtime
channel={"1":"CCTV-1","2":"CCTV-2","3":"CCTV-3","4":"CCTV-4亚洲",
        "5":"CCTV-4欧洲","6":"CCTV-4meizhou","7":"CCTV-5","8":"CCTV-6",
        "9":"CCTV-7","10":"CCTV-8","11":"CCTV-9","12":"CCTV-10",
        "13":"CCTV-11","14":"CCTV-12","15":"CCTVxinwen","16":"CCTVshaoer",
        "17":"CCTVyinyue","18":"CCTV_E","19":"CCTV-F","20":"CCTV-gaoqing"}

if __name__=="__main__":
        if len(sys.argv)==1:
                Select="1"
        else:
                if string.atoi(sys.argv[1])>20 or string.atoi(sys.argv[1])<=0:
                        print("Out of Range. Please Select 1-20.")
                        sys.exit(0)
                else:
                        Select=sys.argv[1]
        print('正在获取节目单,请稍后...')
        date=strftime('%Y%m%d',localtime())
        response = urllib.request.urlopen("http://tv.cctv.com/soushi/28/0"+Select+"/"+date+".shtml")
        Result=response.read()
        Result=Result.decode('GBK')
        #list=re.findall(r"<div class='tlb_right'><div class='l'>(.+?)<script",Result,re.S)
        #list=re.findall(r"afternoon(.+?)<script",Result,re.S)#上午节目
        list=re.compile(r'上午节目(.+?)<script',re.S).findall(Result.strip())
        #list2=re.findall(r"<li>(.+?)</li>",list[0],re.S)
        list2=re.compile(r'<li>(.+?)</li>',re.S).findall(list[0].strip())
        morning=[]
        afternoon=[]
        listnum=0
        for i in range(len(list2)):
            i=re.sub('<.+?>','',list2)
            if locale.atoi(i[:2])>=12:  #将上午的节目于下午的节目分开
                afternoon.append(i)
            else:
                morning.append(i)
        if len(morning)>len(afternoon):
            listnum=len(morning)
        else:
            listnum=len(afternoon)
        print("-"*80),
        print(" "*13+"上午节目"+" "*26+"下午节目")
        print(" "*14+"========"+" "*26+"========")
        for i in range(listnum):
            if(i<len(morning)):
               print(morning[:5],morning[5:].ljust(30),end=""),
            else:
                print(" "*45,end=""),
            if(i<len(afternoon)):
                print("%-4s %-30s" %(afternoon[:5],afternoon[5:]))
            else:
                print(" "*37)
        print ("-"*80),
        print (" "*24,strftime("%Y-%m-%d"),end="  "),
        print ("%s 节目单" %channel[Select],end="")

我用的是3.1,节目单能显示,就是格式对不齐,再一个倒数第二句的“strftime("%Y-%m-%d"),”不能换成年月日的形式,查资料没解决,那位高手指点一下,谢谢了

论坛徽章:
0
15 [报告]
发表于 2009-08-21 00:25 |只看该作者
48行  print "-"*80,
看看你的控制台宽度是不是80

论坛徽章:
0
16 [报告]
发表于 2009-08-26 08:22 |只看该作者
不行,修改了还是不可以,主要是两排节目单,中间空格数是一样的,但是第一竖排节目汉字有多有少,导致第二竖排对不起,我觉得应该是把前面的输出控制在多少个字节以内。

论坛徽章:
0
17 [报告]
发表于 2009-08-26 08:54 |只看该作者

回复 #16 fy_ay 的帖子

楼上是Linux系统?utf-8终端汉字和数字混排的时候是对不齐的。
要自己动手把字符串全部变成unicode,再计算其长度。

下面的代码可以在linux终端下运行,能对齐。

  1. #! /usr/bin/python
  2. # -*- coding: utf-8 -*-
  3. import urllib,re,unicodedata,string,sys
  4. from time import strftime,localtime
  5. channel={"1":"CCTV-1","2":"CCTV-2","3":"CCTV-3","4":"CCTV-4亚洲",
  6.         "5":"CCTV-4欧洲","6":"CCTV-4美洲","7":"CCTV-5","8":"CCTV-6",
  7.         "9":"CCTV-7","10":"CCTV-8","11":"CCTV-9","12":"CCTV-10",
  8.         "13":"CCTV-11","14":"CCTV-12","15":"CCTV新闻","16":"CCTV少儿",
  9.         "17":"CCTV音乐","18":"CCTV_E","19":"CCTV-F","20":"CCTV-高清"}

  10. def string_width(text):
  11.         """
  12.         text必须是unicode
  13.         """
  14.         s = 0
  15.         for ch in text:
  16.                 if isinstance(ch, unicode):
  17.                         if unicodedata.east_asian_width(ch) in ('F', 'W', 'A'):
  18.                                 s += 2
  19.                         else:
  20.                                 s += 1
  21.                 else:
  22.                         s += 1
  23.         return s
  24. if __name__=="__main__":
  25.         #print len(sys.argv)
  26.         if len(sys.argv)==1:
  27.                 Select="8"
  28.         else:
  29.                 if string.atoi(sys.argv[1])>20 or string.atoi(sys.argv[1])<=0:
  30.                         print "Out of Range, 没有这个台, 请选择1-20."
  31.                         sys.exit(0)
  32.                 else:
  33.                         Select=sys.argv[1]
  34.         print '正在获取节目单,请稍后...'
  35.         date=strftime('%Y%m%d',localtime())
  36.         response = urllib.urlopen("http://tv.cctv.com/soushi/28/0"+Select+"/"+date+".shtml")
  37.         Result=response.read().decode("gbk").encode("utf-8")
  38.         list=re.findall(r"上午节目(.+?)<script",Result,re.S)
  39.         list2=re.findall(r"<li>(.+?)</li>",list[0],re.S)

  40.         morning=[]
  41.         afternoon=[]
  42.         listnum=0
  43.         for i in range(len(list2)):
  44.                 #print time2[i],re.sub('<.+?>','',list2[i])[5:]
  45.                 i=re.sub('<.+?>','',list2[i])
  46.                 if string.atoi(i[:2])>=12:  #将上午的节目于下午的节目分开
  47.                         afternoon.append(i)
  48.                 else:
  49.                         morning.append(i)
  50.         if len(morning)>len(afternoon):
  51.                 listnum=len(morning)
  52.         else:
  53.                 listnum=len(afternoon)
  54.         #print "+"+"-"*37+"+"+"-"*37+"+"
  55.         print "-"*80
  56.         print " "*13+"上午节目"+" "*26+"下午节目"
  57.         print " "*14+"========"+" "*26+"========"
  58.         #print "+"+"-"*37+"+"+"-"*37+"+"
  59.         for i in range(listnum):
  60.                 if(i<len(morning)):
  61.                         print "%-4s %-s%-s" %(morning[i][:5],morning[i][5:]," "*(35-string_width(unicode(morning[i],'utf-8')))),
  62.                 else:
  63.                         print " "*36,
  64.                 if(i<len(afternoon)):
  65.                         print "%-4s %-s %-s" %(afternoon[i][:5],afternoon[i][5:]," "*(35-string_width(afternoon[i])))
  66.                 else:
  67.                         print " "*37
  68.         print "-"*80,
  69.         print " "*24,strftime("%Y年%m月%d日"),
  70.         print "%s 节目单" %channel[Select]


复制代码

[ 本帖最后由 two 于 2009-8-26 09:18 编辑 ]

论坛徽章:
0
18 [报告]
发表于 2009-08-27 14:14 |只看该作者
有创意!

论坛徽章:
0
19 [报告]
发表于 2009-08-27 16:18 |只看该作者
学习 谢谢

论坛徽章:
0
20 [报告]
发表于 2009-08-27 22:20 |只看该作者
http://www.cctv.com/download/showtime.zip

这个地址里面有全部的数据文件,每周更新。。

不用那么费劲分析了。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP