【教程】如何定制自己的信息源

 

要使用自己的信息源,从行为上说有两个步骤:

1、写一个xml文件(定义信息源,这一步略复杂

2、把这个信息源的id写入一个或多个用户的.txt文件(启用信息源,这一步极简单

 

定义信息源的意义在于:

把各种来源不同、形式不同的信息,导入到InfoPi的信息处理框架内。

这个框架很简单,即:一条信息有5+1个字段。

        5个字段是标题、链接、作者、摘要、发布时间。

        1个字段是suid,它是信息与数据之间的桥梁。

        详见《运行机制》一文的数据库设计部分。

 

可能有的网友看后觉得很麻烦。InfoPi是很严谨灵活的,在保证严谨、灵活的前提下,操作已经很简化了。

建议先了解InfoPi的运行机制,主要是数据库设计那部分,了解机制后所谓的麻烦就是枝叶。

 

也欢迎提意见,指出哪些地方写的不清楚、需要补充。

 

目录:

 

  • 信息源简介
  • rss_atom的使用
  • html_re的使用
  • callback回调代码的使用
  • 测试自己定制的信息源
  • 自带的几个例子
  • 经验 && 小技巧 (动手操作前看一下)

 

 

信息源简介

信息源,就是对信息来源的定义。InfoPi会根据信息源去获取信息,获取后会返回一个列表,列表通常包含一条或多条信息,列表也可为空。

一个信息源的具体形式是一个xml文件,下图说明了该文件的总体结构。

【教程】如何定制自己的信息源_第1张图片

总体而言,分为三部分:

  1. name、comment、link。分别是信息源的名字、备注、链接,这些内容主要是给人看的,name会作为信息的默认作者/出处。
  2. worker、data。worker是一个函数,用于获取特定类型的信息。data是驱动worker工作的数据。
  3. callback。回调代码,里面可以有一小段Python程序代码,对每条信息进行后处理。  

 

InfoPi自带了两个常用的worker:

  1. rss_atom。用于处理RSS、ATOM订阅,常用于博客。
  2. html_re。用正则表达式提取html(网页)里的信息。

 下面对这两个worker的用法进行分别讲解。

 

rss_atom的使用

这个worker的用法很简单,只要在data里创建一个url元素,在里面填上RSS或ATOM的网址就可以了,如图:

【教程】如何定制自己的信息源_第2张图片

有些web服务器不发送RSS、ATOM文件的编码,或者发送的是错误的编码。这时给url元素加个encoding属性,在里面指明编码即可:

<url encoding='utf-8'>http://whis.cssn.cn/sjs/sjs_sjgdzgs/</url>

(如果嫌麻烦,可以安装自动检测编码的模块,见此文。但是自动检测的运行性能较低,不推荐使用。)

 

信息源的<url>标签也支持errors属性,用法和Python解码的errors参数相同:

<url errors='strict'> 这是默认值,表示对解码错误零容忍,将引发一个异常

<url errors='ignore'> 忽略解码错误

<url errors='replace'> 解码出错时用?替换

encoding属性和errors属性可以同时使用。

(errors属性仅2015.05.23以后版本才有)

 

rss_atom默认使用信息源的name作为每条信息的author,如果想使用feed自身提供的出处,增加一个use_feed_author空标签就可以了,如下图。这适用于聚合类的feed。

【教程】如何定制自己的信息源_第3张图片

 

html_re的使用

html_re的总体结构是这样的

【教程】如何定制自己的信息源_第4张图片

具体见此图

【教程】如何定制自己的信息源_第5张图片

 

在maprules里,可以进行字符串拼接,用下图的author举例:

        信息的author = '天涯-' + 第1个括号捕获的内容

        要拼接的内容用逗号隔开,单引号内是字符串,单独的数字表示第几个括号捕获的内容。

假如第1个括号捕获的内容是煮酒论史,那么拼接后的author就是天涯-煮酒论史

【教程】如何定制自己的信息源_第6张图片

 

在有些网页,提取出的url链接是相对路径,并不是完整路径。

这时,可以按上图的方式拼接出完整的url,也可以用下图的方式自动拼接url。

【教程】如何定制自己的信息源_第7张图片

 

感兴趣的信息可能分布于同一个页面的不同位置,这时使用多个block即可,程序会依次处理。

 

callback回调代码

callback回调代码是一小段Python程序代码,InfoPi会在获取信息后调用它,用于对每条信息进行后处理

 

每条信息会被作为变量info传入回调代码,可以对其任意处理。

info对象有如下属性(汉字为说明):title 标题、url 链接、author 作者出处、summary 摘要、pub_date 发布日期、suid 唯一标识符、temp 一个临时变量。要想了解这些属性的涵意,请参看此文的数据库设计部分http://www.cnblogs.com/infopi/p/3974717.html

 

比如这是删掉author以“娱乐八卦”为结尾的信息:

【教程】如何定制自己的信息源_第8张图片

 

几个小窍门:

1、代码要写在CDATA里,缩进方式同Python。

2、如果想删除某一条信息,给info变量的temp属性赋值'del'即可,如上图。

3、与info变量一同传入的还有posi变量,这是一个整数,表示这条信息在列表中的位置,第一条信息的位置为0。

(posi变量仅2015.06.14b以后版本才有)

4、会传入一个hasher(string)函数,用于计算字符串的散列值,返回一个散列值的字符串。

(hasher函数仅2015.07.10a以后版本才有)

5、会传入一个unixtime(string, fmt='%m-%d %H:%M')函数,用于把unix时间戳转化为日期时间字符串,fmt的用法同Python。

(unixtime函数仅2015.07.14a以后版本才有)

6、严格来说,这是一段回调代码,而非一个回调函数,所以不要在callback里使用return语句。

7、如果回调代码仍然无法满足对信息处理的要求,可以自己写一个worker。

 

测试自己定制的信息源

在infopi的src目录下,有test_source.py文件,执行它即可测试某个指定信息源是否能正常工作。

这里测试weather:bjair,把它作为唯一参数执行就可以了:

【教程】如何定制自己的信息源_第9张图片

 

自带的几个例子

自带的演示配置demo_cfg.zip里有一些例子,请看admin.txt的结尾部分:

# health:fzhh 演示了如何订阅普通博客
# jilupian:cctv9 演示了html_re如何在一个页面里解析两个以上block的内容
# bbs:tyhr 演示了信息源如何继承父信息源的内容,适用于同一个模块生成的多个页面
# 3c:rasppi 演示了如何使用callback回调代码生成更有效的suid
# bbs:tyhome 演示了如何在callback回调代码里删除特定信息
# update:flask 演示了如何使用自定义worker

经验 && 小技巧

1、可以在日常使用的电脑上安装一个InfoPi(最好和树莓派的版本一致),用test_source.py测试自定义的信息源能否正常工作。

2、看看示例配置的admin.txt文件,里面有一些使用上的讲解。

3、记不住xml文件的结构?可以复制一个示例xml文件,改改内容。

4、存放xml文件的目录名xml的文件名会作为信息源ID的组成部分,确定后尽量不要改动,所以起名前多思量一下。为了确保跨平台使用,建议文件名、目录名全部用小字字母。详细介绍见此文目录结构一段。

5、rss_atom和html_re会自动把提取到的字符串里的html标签去掉。

6、要修改服务器的配置,按这个顺序:下载配置zip文件 -> 解压zip -> 修改配置 -> 打包zip -> 上传zip。

7、不建议使用windows自带的记事本,推荐使用开源的文本编辑器Notepad++。

你可能感兴趣的:(教程)