《备份CSDN博客正文到本地存档》一文中,采用硬编码的方式备份了CSDN上的博文,效果还不错,只是很多人遇到了编码的问题,这个比较容易解决。所谓编码问题无非就两点,第一就是浏览器的编码配置的不对,这样会导致用浏览器打开保存到本地的文章时出现乱码;第二就是操作系统的编码配置的不对,这样会导致保存到本地的文章的文件名为乱码。配置好二者就好了。我使用的操作系统是Mac OS X 10.7中文版,浏览器是Firefox,没有遇到编码问题,然而使用Safari浏览器需要手工将其编码设置为GB2312或者GB18030才可以。
         除了编码问题之外,还有一个问题就是不支持其它的博客。这个问题解决起来也不难,实际上源码中的大致框架已经确定,余下的仅仅是定义一些标签以及回调函数即可,对于java这很容易,比如定义下面类似的超类:
abstract class Site {     public String atl_name;     public String atl_value;     public abstract int ParseIMG(NodeList nlist, int index);     public abstract int ParseTITLE(NodeList nlist, int index);     public abstract int ParseAUTHOR(NodeList nlist, int index);     public abstract int ParseMonthArticle(NodeList nlist, int index);     public abstract int ParsePerArticle(NodeList nlist, int index);     public abstract int ParsePAGE(NodeList nlist, int index); }
然后将源码中的方法进行一个类似下面的调整:
public static int parseImg(NodeList nlist, int index, Site st) {     return st. ParseIMG(nlist, index); }
同时小小修改一下HandleText方法的逻辑,比如类似下面的代码需要根据不同的子类来定义成不同的逻辑:
if (node instanceof Div)
最终我们来定义特定于不同网站的不同的Site子类,分别实现不同的abstract方法即可。这里的关键点是,我们对于每一个博客网站抽象出来了几个要素:
1.博客标题,比如“黎明的丰收”
2.按照月份存档的链接链表
3.每月存档的文章链接链表
4.每月存档中的每一篇文章
5.每一篇文章中的每一个图片
6.第3类的分页显示处理
只要可以处理以上6个要素即可,因此定义了处理以上要素的超类Site,然后对于不同的博客站点分别实现对应的方法就行了,需要说明的是,目前还不能支持不能按月份索引的博客。
       整个过程其实就是在使用htmlpaser解析页面的过程中采取一些动作将其下载到本地并且按照一定的规则进行保存。