案例研究:使用python获取中央电视台的节目单

来源:互联网 发布:淘宝介入买家没有举证 编辑:程序博客网 时间:2024/04/29 09:10

 

今天在ChinaUnixPython子论坛上发现了一篇有趣的文章,该文章展示了使用Python从中央电视台的网站上获取各个频道的节目单(仅限当天)。鉴于最近在学习Python,我就其代码简要分析了它的设计思路。

该代码由网友two编写发布,原地址为http://bbs3.chinaunix.net/thread-1533449-1-1.html,我简单修改了一下,代码如下:


首先给出它的运行效果:


为了从网站上得到相关频道的节目表,需要几个步骤:

首先,必须找到节目表所在的网址。或许你可以在很多网址上都可以得到节目表,但鉴于我们要获取多个(20个)频道的节目表,那么我们需要的网址应该对应频道有一定的规则。通过查找,网址“http://tv.cctv.com/soushi/28/0"+Select+"/"+date+".shtml”将满足我们的要求,其中Select是频道对应的数字,下图展示了对应情况,当然你可以在网站上得到确认;而date则是“%Y%m%d”格式的当天时间。


在找到网址后,我们就可以使用urllib库提供的函数获取节目单所在网址的内容。

接下来,我们需要在该网页上查找与“节目单”相关的信息,通过分析,下面是截取下的关键信息:

…………

<div class='tlb_right'><div class='l'><h4>上午节目(00:00-12:00)</h4><ul><li><div class='important'><span class='time'>00:20</span><span class='tv_name'><a href='http://space.tv.cctv.com/podcast/cfgsh' target="_blank">财富故事会:卖火柴的大男孩</a></span></div></li><li><div class='important'><span class='time'>00:50</span><span

…………

<h4>下午节目(12:00-24:00)</h4>

<ul>

<li><div class='important'><span class='time'>12:30</span><span class='tv_name'><a href='http://space.tv.cctv.com/podcast/cfgsh' target="_blank">财富故事会:彩绘人生</a><a href='http://space.tv.cctv.com/article/ARTI1249871117358656' target='_blank'><img src='/Library/soushi08/image/dot_icon02.gif' alt='点击进入栏目预告' title='点击进入栏目预告' align='absmiddle' /></a></span></div></li><li><div class='important'><span class='time'>13:00</span><span class='tv_name'><a

…………

  <script type="text/javascript">

…………

从上面分析,我们需要的节目单信息在“上午节目”与“<script”之间,而每个节目则对应了一个<li>……</li>标记对,正则表达式库re可以帮我们完成这一点:

list=re.findall(r"上午节目(.+?)<script",Result,re.S)             1

list2=re.findall(r"<li>(.+?)</li>",list[0],re.S                         2

那么正则表达式r"上午节目(.+?)<script"该如何理解呢?圆点代表了任意字符,而+?则代表了匹配任意个圆点(通过查询re库的help文档,你可以得到详细的解释),即任意个数的任意字符,直到找到<script。而一对括号意味着对找到的匹配字符串按组保存在list中。而语句(2)中的list[0]正是引用了找到的第一个字符串。实际上在该网页中你也只可能找到一个。

在得到每条节目信息后问题就变得很简单了,只需要剪去所有的标记就会得到纯粹的节目信息,这里同样使用了正则表达式:

i=re.sub('<.+?>','',list2[i])                                                   3

举个例子,上面代码中蓝色标记的节目信息在执行了语句(3)后,将得到“00:20财富故事会:卖火柴的大男孩”,那么通过i[:5]和i[5:]就可以剪切出节目的时间和名称。至于如何区分上下午就更简单了。

至此,所有的节目信息都已准备完毕,如何展示给用户就不必再说了。

 

题外话:从上面的分析可以看到,这个案例在很大程度上就是需要设计者不厌其烦地从大量数据中去抽取我们感兴趣的信息。当我们已经了解了如何获得该信息时,问题的实现就变得很简单了。实际上,该问题不但可以用python来解决,C、Java或者Perl同样可以胜任。或许你会觉得这个问题很简单,但它从一定程度上解决了当面对一个新问题时我们该如何做?

当然,你或许会问,为什么只能得到当天的节目单呢?我想获得昨天或者前几天的节目单难道就不行么?当然可以,只要你善于发现,动手去做,一切皆有可能。