sinablog2wordpress:从新浪博客搬家到WordPress

Screenshot

要从新浪搬到Wordpres,网上广为流传的方法是利用blogbus的博客搬家服务获得blogbus格式的xml,然后再用一个Python写的脚本把它转换成WordPress认识的格式。但是这种方法在最近新浪博客升级以后就失效了。于是自己用现学的scala写了一个小程序,搬家时能保留标签目录评论评论回复这些信息。

猛击[这里]下载。注意,此程序仅支持2010年初的新版新浪博客,之前或之后的版本都不支持。

要运行程序,你需要确保已经安装过JRE。双击运行后显示如图界面,填入自己的博客地址(不要省略“ http:// ”),然后点击“Start”即可。这时“Start”按钮变为灰色,标题栏显示“Extracting”。等待几分钟,当标题栏显示为“Done”、“Start”按钮重新变为可用时,程序所在目录下会出现一个blog.xml文件。把这个文件直接导入WordPress就可以了。

代码也打在jar包里了,MIT协议。欢迎报告bug。

下面是废话。

恩由于新浪用了ajax,评论信息是通过xhr异步读取的,用一般的方法没法抓到。我纠结许久,最后是用了非常ad hoc的方法解决的,不知道有没有什么什么不太麻烦的通用解决方案呢。

再扯两句scala。我都想不起来当初具体是怎么想到要学scala的,也许是为了了解下函数式编程,也许只是想在jvm上有一个喜欢的语言吧——Java写起来太不爽了;Java社区的低效和保守也已经开始显出C++的影子。

scala确实是非常强大和灵活;我在见到一些颇富技巧性的hack之后都有些怀疑scala社区的风气会不会慢慢变得像C++社区一样过分热衷技巧的炫耀。不过scala的设计目标就是以较简单的语法规则获得最大的scalability,不需要通过挖掘语言规范里的犄角旮旯来实现一些必要功能,所以不会像C++一样成为一门本身已相当复杂,却还需要别人反过来教语言发明者如何使用的语言。

scala毕竟表现力比Java强太多,代码也简洁太多。比如这次我需要实现一个抛出异常后重试若干次的逻辑,只需定义一个函数:

def tryFor[T](times: Int)(op: => T): T = {
  if (times <= 0) throw new RuntimeException("Operation failed.")
  try { return op } catch {
    case e: Throwable => e.printStackTrace
    tryFor(times - 1)(op)
  }
}

然后这样使用:

val source = tryFor(5) {new Source(url)}

程序就会不断获得网页源代码,并在5次失败后抛出异常。Java实现同样的东西可不会如此优雅了。又如下面这段代码返回一篇博文xml:

private def generateEntryXml(entry: BlogEntry) = {
  <item>
    <title>
      {entry.title}
    </title>
    <wp:post_date>
      {dateFormat.format(entry.postDate)}
    </wp:post_date>
    <category>
      {entry.category}
    </category>
    {for (tag <- entry.tags) yield <category domain="tag">{tag}</category>}
    <content:encoded>
      {xml.Unparsed(handleNewLines(entry.content))}
    </content:encoded>
    <wp:status>publish</wp:status>
    {for (comment <- entry.comments) yield generateCommentXml(comment)}
  </item>
}

注意,xml标签直接作为scala的源代码的一部分在代码中出现!虽然我觉得这样会使scala语言多出一种“特殊情况”,增加语言的复杂性,但不得不承认这样的设计确实非常优美简洁。

我比较看好scala,以后自己做跑在jvm上的东西scala应该是首选语言。推荐有兴趣的童鞋也了解一下。

    分享到:

可能你对下面的文章也感兴趣:

  • Kevin

    虽然你说“此程序仅支持2010年初的新版新浪博客,之前或之后的版本都不支持”,但我用了还是能够保存一个blog.xml的文件,打开看了基本正确,但在导入时出了问题,提示:Sorry, there has been an error.This does not appear to be a WXR file, missing/invalid WXR version number。不清楚是什么原因。不知道楼主还做不做更新呢?

    • 逆铭

      Sorry暂时没有时间改这个程序:(……建议你可以先从wordpress导出一个文件,然后对比格式有什么不同。如果只是少一个版本号的话,直接手工加上去应该不会太麻烦的

  • doggie

    多谢!
    可是似乎只能到处文本文件,图片和评论都无法导出。

  • Begonia

    谢谢博主,居然一次成功,除了标签都搬过来了。
    我的WP是最新版本3.1.1

  • 魏明明

    我下载后不知道双击哪个才能运行。请指点。

  • Helen

    1.不支持现在的格式了好像,我看导出的xml跟WP导出的有点不一样。
    2.应该没关系的,只是我用IE查看说格式错误,我看所有标签都是前后大小写不一致。
    3.我不能回复啊留言。

  • Helen

    bug呀,xml里段落标记开始都用的小p,结束用的大/P。

  • Helen

    备份为xml了,请问怎么导入WordPress?导入里那几个选项(Blogger,Israblog,LiveJournal,Movable Type 和 TypePad。。。)我都试了不行啊?

    • 逆铭

      这个做得太久远不知道还支不支持现在的新浪博客了。。要导入的话应该导入WordPress格式,不行的话就是不行了

  • http://chenxi.me Chenxi

    楼主有空更新一下吧,支持新版的新浪博客,这个东西目前网上说的方法都不可行啊。

  • http://filmovie.info 笑眯眯的狗

    error:java.lang.stackoverflowerror

  • http://filmovie.info 笑眯眯的狗

    牛人啊,我找了这么好半天,终于找到了。验证方式好有趣

  • http://evo.eu5.org Impreza

    正在使用你的方法,希望有用。
    小弟也刚入门编程,要向你学习了

  • http://fanzhaoxin.blogspot.com/ Felven

    询问,导入到Google博客中为何会出错,这个和WordPress不是一回事么?

    回复:格式应该不一样。。

  • http://fanzhaoxin.blogspot.com/ Felven

    从新浪博客搬家到Google博客,好啊

  • http://www.jinmen.tk 金门

    要是可以从QQ邮箱订阅里面导出文章那就好了,

    那里面全,而且原文被河蟹掉以后还可以看到

  • http://www.jinmen.tk 金门

    好像是蛮多的…..

  • http://www.jinmen.tk 金门

    楼主,我出错了,

    Error:java.lang.StackOverflowError

    回复:可能是你的博文篇数过多了吧?这个是我偷懒没考虑。。可以试着一部分一部分导入:每次除了要导入的文章外其余文章先放进回收站里。这样会比较麻烦了,抱歉。。。

  • pRobE

    不支持嵌套回复啊…麻烦问一下你用的什么IDE?我用Eclipse怎么没代码提示…是不是IntellJ好点?

    回复:支持是支持,不过以后如果要导入导出的话会麻烦很多,于是索性就这样了。Eclipse可以调出来代码提示的,不过我用的就是intellj,不太熟eclipse

  • pRobE

    拖走学习了…
    Scala对XML的支持真是方便,之前用JAVA写没吐血(或者是我菜了…)以后得多向您学习啊…还是googlecode 赞一个~

    回复:额这次写的代码因为不熟悉语言所以把握不好风格,写得比较ws应该没什么参考价值。。。放在googlecode上只是为了节省流量= =

  • http://blog.huxuan.org Victor.Hu

    先偷走了哈!

  • http://hexun.com/combooleaf Xana

    你就不能把回复不弄成斜体啊……非常的别扭诶……

    回复:试试blockquote效果如何。。

  • https://twitter.com/___matrix matrix

    留言时看到这个验证方式有种被侮辱智商的感觉嗯

    回复:那不如我记下你ip,然后每次你要留言验证码都是一道微积分题吧。。。

  • 健康之泉

    搬家到Godaddy了?twitter怎么翻墙看啊,麻烦啊。

    回复:有很多第三方可用,比如https://rabr.in/

  • http://wangtianqi.com/blog czyhd

    围观,提交方式不错啊~

  • http://vinmusic.com feicun

    以后来跟你学coding – -
    另外如果为了防垃圾留言的话,试试 some chinese please! 这个插件,比你这个验证码的友好的多,因为大多数垃圾留言都是纯英文的,所以用这个插件就够了

    回复:这个插件真的很让人困扰么?我怎么觉得很有趣呢= =

  • pRobE

    问候一下…
    俺也应该去学学Scala了,JAVA有些地方是有点…
    话说您这个WordPress搞得真不错,尤其这个Captcha…

    回复:恩我也觉得这个captcha很有爱。。

  • 清风未明

    不过你的验证码敢不敢不要这么恶!!!!!

    回复:囧。。。

  • 清风未明

    哈哈,我是大牛第一个膜拜者呀,舒舒服服一个沙发

    回复:
    囧。。。

标签云