摘要:点点博客备份XML通过DiandianToWordpress-beta.sh(文末给出)搬家Wordpress博客

本人曾使用过点点轻博客,也深知像点点博客,Lofter博客导出的XML文件不能直接导入到wordpress博客中的烦恼

当时也没什么办法,只能指望官方良心,别莫名其妙的关闭博客,最近接触shell,研究了大概两三天的时间,最浪费时间的就是精简wordpress的XML文件,因为导出的XML文档很多标签,而有些标签去掉,则会导致导入时失败,所以很消耗时间,不过最终还是搞定了搬家的问题

首先说一下这个shell脚本的特点,因为是一个shell尝试,所以转化仅仅是最基本的,大神路过轻吐槽

  • 可以把点点“文字”导入(其它类型暂时不可)
  • 可以保留标签
  • 可以保留文章日期(精确到天,但发布时间都为20:00:00)
  • 图片可以正确显示(依然保存在点点,不过生成ImagsURL列表可批量下载保存到本地)
  • 文章ID不可保存(无损搬家看来有点难)

后面会解释为什么有些没有实现

如果你需要解决眼下的燃眉之急,可以直接到文章后面复制脚本并使用,不过建议看看博主的探索过程,以便今后遇到同类问题能快速解决


首先介绍下基础知识

(1)XML文件

简单来说,就是一种“可视话”的数据保存文档,没有样式,通过嵌套的标签来存储数据,你可以使用任何文本编辑器来查看它的内容,各种程序也可方便的使用其中的数据。你可以花十多分钟来看看教程(W3school),看看前面的基础就足以应付后来的工作了

点点备份的XML文件标签及数据结构和Wordpress博客备份的不一样,所以互相的不能识别,不能导入,我们做的工作很简单,就是把标签进行转换,然后就能成功导入Wordpress博客

(2)SHELL脚本

本文假设你知道shell脚本并且已经会执行脚本

那么多的标签,如果手工改动,相信是件可怕的事情,即使是使用编辑器的全局替换,相信也是件浪费时间的事儿

那么作为批处理,SHELL的强大就无与伦比了。

(3)点点和wordpress的XML备份文件结构

点点博客XML文件Tag和结构(点击放大)

Wordpress博客XML文件Tag和结构(点击放大)

简单的说明下特点,点点博客的Post标签中保存文章,而Wordpress是item标签,类似的还需要替换一些标签,结构不同的地方体现在图片的保存,点点博客的图片单独保存在Images中,文中的图片保存的是ID,而后根据ID到images里找对应的URL,转化得到图片地址,而wordpress中的文章直接保存的就是图片URL。由于博主刚接触shell,了解的也是最基本的,但是感觉应该可以通过脚本自动转化,所以尝试探索。


解释下未实现的功能

博主的shell水平,简单的说,连简单的替换都需要通过搜索引擎才能写的出来。有两句话关于shell的话,很有意思。

  • Where there is a shell, there is a way
  • 一句shell代码等同于百句C语言代码

有点夸张,不过确实说明了shell的强大。说这么多关于shell的,其实没别的意思,因为后面的脚本是四处拼凑,请教他人才整理出来的,所以懂shell的人看见一定会受不了一些实现方式,编码风格等等,现在我也没那实力更改,所以就只能这样了

之所以分享出来,一是可以给需要的人使用,二是因为这是自己第一次用shell解决实际问题,很高兴,值得纪念

而文章的标题“(一)”也代表博主会通过不断的探索,后续写出高效的代码,实现更多的功能。

在此解释一下几个功能无法实现的原因:

  • 由于时间精力有限,没能对比“图片”,“声音”的格式,后续更新会补上的
  • 时间无法显示发布时间是因为点点保存时间用的是一串数字“1390136672987”分析了一阵,才弄明白前十位“1390136672”是从1970-01-01年开始到日志发布的秒数,经过转化是2014-01-19后面的三位一定是表示小时和分钟了,但是由于当时的主要精力没放在这,而且算了半天也没搞懂后三位是怎么表示的,所以只得把时间缺省为20:00:00,这也是无奈之举
  • 运行脚本可以生成图片链接表,可供下载,不过下载回来的图片是经过点点压缩的尺寸。不是原图,以后会添加原图下载的
  • 点点文章的格式是http://域名/post/2014-01-28/40060879713,后边的“40060879713”就是文章ID,wordpress默认的链接是/?p=ID所以最开始我是打算把ID信息也转化,搬到wordpress不会出现搜索引擎收录访问不了的情况,但是由于点点的ID数字过大,导致导入到数据库中的话,会溢出,破坏数据库。所以我不知道如何处理。知道的朋友一定要相告哦!

该交代的都交代了,下面是脚本


关于脚本的使用和说明

DiandianToWordpress-beta.sh文件保存的是shell程序
[toggle title="点击展开DiandianToWordpress-beta.sh"]

[shell]
#!/bin/bash

cp diandian_backup.xml diandian.xml
#分割原始文件
sed -n '/<Images>/,/<\/Images>/p' diandian.xml > IDtoSrc.txt
cp IDtoSrc.txt ImagesURL.txt
sed -i '/<Images>/,/<\/Images>/d' diandian.xml

#处理IDtoSrc.txt格式
sed -i '1d;$d' IDtoSrc.txt
sed -i '/<Image>/d' IDtoSrc.txt
sed -i '/<\/Image>/d' IDtoSrc.txt
sed -i 's/\s\s\s\s\s\s\s\s\s\s\s\s//' IDtoSrc.txt
sed -i ':label;N;s/\n/=/;t label' IDtoSrc.txt
sed -i 's/<Id>//;s/<\/Id>=<Url>/=/g;s/<\/Url>=<Id>/\n/g' IDtoSrc.txt
sed -i 's/<\/Url>//g' IDtoSrc.txt

#根据IDtoSrc.txt内容替换图片正确地址
awk 'NR==FNR{split($0,a,"=");b[a[1]]=a[2];next}{for(i in b){gsub(i,b[i],$0)};print $0}' IDtoSrc.txt diandian.xml > tmp.txt
sed -i 's/libdd/papaapp/g' tmp.txt
sed -i 's/id=/src=/g' tmp.txt

#保存图片链接到ImagesURL.txt
cat ImagesURL.txt | grep "<Url>" > I.txt
sed -i 's/\s\s\s\s\s\s\s\s\s\s\s\s//' I.txt
mv I.txt ImagesURL.txt
sed -i 's/<Url>//g;s/<\/Url>//g' ImagesURL.txt

#复制点点博客中的有用数据到f.txt中
#复制wordpress头到点点XML中
cat WP-head.txt  > f.txt
echo "<channel>" >> f.txt
#复制<BlogInfo>并修改
sed -n '/<BlogInfo>/,/<\/BlogInfo>/p' tmp.txt >> f.txt
sed -i '/<BlogInfo>/d;/\/BlogInfo/d' f.txt
sed -i 's/BlogName/title/g' f.txt
sed -i '/<BlogUrl>/d' f.txt
sed -i 's/BlogDesc/description/g' f.txt
sed -i '/<BlogPic>/d' f.txt
echo "<wp:wxr_version>1.2</wp:wxr_version>" >> f.txt

sed -n '/<Posts>/,/<\/Posts>/p' tmp.txt >> f.txt
sed -i '/<Posts>/d;/\/Posts/d' f.txt
sed -i 's/<Post>/<item>/g;s/<\/Post>/<\/item>/g' f.txt

#处理item内数据
sed -i '/<Author>/a\<dc:creator>admin<\/dc:creator>' f.txt #查找并在下行添加数据
sed -i '/<Author>/d' f.txt
awk -F'[<>]' '/<CreateTime>/{$0=sprintf("<%s>%s<%s>",$2,strftime("%F",substr($3,1,10)),$4)}1' f.txt > f.xml
mv f.xml f.txt
sed -i 's/<CreateTime>/<wp:post_date>/g' f.txt
sed -i 's/<\/CreateTime>/\ 20:00:00<\/wp:post_date>/g' f.txt
sed -i '/<ModifiedCreateTime>/d' f.txt
sed -i '/<Id>/d' f.txt
sed -i '/<PostType>/a\<wp:post_type>post<\/wp:post_type>' f.txt
sed -i '/<PostType>/d' f.txt
sed -i '/<PostId>/d' f.txt
sed -i '/<wp:post_type>/a\<wp:status>publish<\/wp:status>' f.txt
sed -i '/<Privacy>/d' f.txt
sed -i '/<Source>/d' f.txt
awk -F'[<>]' '/<Tag>/{"echo -n \042"$3"\042 | od -An -tx1 -w30 | tr \047 \047 %" | getline s;printf "<category domain=\"post_tag\" nicename=\"%s\"><![CDATA[%s]]></category>",s,$3}1' f.txt > f.xml
mv f.xml f.txt

#Tag标签更改后原标签不能删除,不知为何,就现这样吧,不影响导入
sed -i '/<Tags>/d;/<\/Tags>/d' f.txt
sed -i '/<CreativeCommonsSetting>/,/<\/CreativeCommonsSetting>/d' f.txt
sed -i 's/Title/title/g' f.txt
sed -i 's/<Text>/<content:encoded><\!\[CDATA\[/g' f.txt
sed -i 's/<\/Text>/\]\]><\/content:encoded>/g' f.txt

#替换符号
#sed -i '/<content:encoded>/s/&gt\;/\>/g' f.txt
#sed -i '/<content:encoded>/s/&lt\;/\</g' f.txt

echo "</channel>" >> f.txt
echo "</rss>" >> f.txt

mv tmp.txt c.xml
mv f.txt finish.xml
[/shell]

[/toggle]
WP-head.txt保存的是wordpress的XML文件相关说明,没有则会保存
[toggle title="展开WP-head.txt"]

[code]
<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0"
xmlns:excerpt="http://wordpress.org/export/1.2/excerpt/"
xmlns:content="http://purl.org/rss/1.0/modules/content/"
xmlns:wfw="http://wellformedweb.org/CommentAPI/"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:wp="http://wordpress.org/export/1.2/"
>
[/code]

[/toggle]

使用方法:你需要在linux下操作,把主shell和WP-head.txt(名称不可变)内容复制并保存在本地

然后把点点的XML备份文件改名为diandian_backup.xml放在同一文件夹

运行主shell,会自动生成三个文件,IDtoSrc.txt,ImagesURL.txt,finish.xml

IDtoSrc.txt 的内容是点点文章图片ID对应的URL转化

ImagesURL.txt 的内容是点点文章图片的URL,可方便批量下载,再次提示(是经点点压缩后的)

finish.xml 就是转化后的文件了,快导入到博客看看效果吧~^_^

这就是前些天的探索和实践了,一不小心就写了这么多,有些复杂的内容转换,一条命令就可以搞定,不尽感叹shell的强大。

SHELL!I COME!

[探索]点点轻博客搬家到WordPress(一)的更多相关文章

  1. chanme的博客搬家了!

    一直以来都想自己租一台服务器,买个域名做一个自己的博客,但是由于时间和知识的关系,以前还不太知道怎么搭一个博客.终于我在上个礼拜成功的迈出了建站的第一步,然后陆陆续续的也将一些后续的步骤做好了.所以今 ...

  2. 用 Flask 来写个轻博客 (29) — 使用 Flask-Admin 实现后台管理 SQLAlchemy

    目录 目录 前文列表 扩展阅读 Flask-Admin BaseView 基础管理页面 ModelView 实现效果 前文列表 用 Flask 来写个轻博客 (1) - 创建项目 用 Flask 来写 ...

  3. 博客搬家了,欢迎访问 http://blog.csdn.net/yinpengxiang/

    博客搬家了,欢迎访问 http://blog.csdn.net/yinpengxiang/

  4. 博客搬家啦。请访问我的新底盘www.boyipark.com

    博客搬家啦.请访问我的新底盘 www.boyipark.com

  5. 博客搬家到CSDN:http://blog.csdn.net/yeweiouyang

    博客搬家到CSDN:http://blog.csdn.net/yeweiouyang

  6. 博客搬家 https://hanwang945.github.io/

    博客搬家 https://hanwang945.github.io/

  7. 博客搬家一下到CSDN

    博客搬家一下到CSDN:http://blog.csdn.net/weixin_33409246

  8. 博客搬家了,新域名dinphy.wang

    博客搬家了,新域名      dinphy.wang 博客搬家了,新域名      www.dinphy.wang 博客搬家了,新域名      dinphy.wang 博客搬家了,新域名     w ...

  9. 全球最大轻博客APP确认被苹果下架!

    读 苹果确认了App Store下架轻博客应用Tumblr,主要原因是,该应用没有很好的过滤掉一些成人内容(成人内容多到夸张),这严重影响了未成年人. 事实上,iPhone和iPad版Tumblr应用 ...

随机推荐

  1. 如何设置eclipse在默认模式下打开文件

    如何设置eclipse在默认模式下打开文件 打开eclipse.选择例如以下:windows --> preferences --> General --> Editors --&g ...

  2. SpringAop进行日志管理。

    在java开发中日志的管理有非常多种.我通常会使用过滤器,或者是Spring的拦截器进行日志的处理.假设是用过滤器比較简单,仅仅要对全部的.do提交进行拦截,然后获取action的提交路径就能够获取对 ...

  3. ArcGIS 10 破解安装(win7 64位)

    上一周换了个win7 64位系统,昨天依照各种各样破解方法装ArcGIS10装了一天,装上之后ArcMap能用,可是装的AO sdk不能用,在VS2008里一拖就报错,确实把我给气坏了.今天早上上班, ...

  4. 微软自家Dism的妙用

    很多人应该都听说过Dism,是微软自带的工具,其实自从Win8发布以来Dism的功能就大幅度增强了,大家都知道系统里面有个打开关闭Windows功能,  但是在这里你只能关闭这些功能,却不能删除他们. ...

  5. 【SSH 基金会】SSH框架--struts进一步的详细解释(两)

    继上篇博客 既然我们知道了不使用struts给我们带来这么多弊端,那么以下我们来看看struts是怎样封装的.怎么解决我们出现的问题的? 先来说一下struts的基本流程,帮助大家理解以下的代码: S ...

  6. Android一些解决方案内存问题(一)

    通常我们遇到内存问题时,,解决方案一般有以下的例子: 1.做一些处理上的内存引用,经常使用软引用.加强引用.弱引用: 2.加载在内存中的照片时,它可以处理直接在内存,例如:压缩边界. 3.内存的动态恢 ...

  7. SSIS从理论到实战,再到应用(5)----流程控制之Foreach循环

    原文:SSIS从理论到实战,再到应用(5)----流程控制之Foreach循环 上期回顾: SSIS从理论到实战,再到应用(4)----流程控制之For循环 上一期讲了For循环,Foreach循环相 ...

  8. 浅谈数据结构之KMP(串中的模式匹配算法)

    KMP算法是一种模式匹配算法的改进版,其通过减少匹配的次数以及使主串不回朔来减少字符串匹配的次数,从而较少算法的相应代价,但是,事件万物是普遍归中的,KMP算法的有效性也是有一定的局限的,我将在本文的 ...

  9. 【Flume NG用户指南】(2)构造

    作者:周邦涛(Timen) Email:zhoubangtao@gmail.com 转载请注明出处:  http://blog.csdn.net/zhoubangtao/article/details ...

  10. linux_java_redis_postgresql_常用命令

     redis 常用语法telnet 192.168.18.210 6379keys *llen队列名称llen 队列名称 postgresql常用语法psql -h192.168.18.210 -Up ...