摘要:点点博客备份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. DBA工具——DMV——通过sys.dm_exec_procedure_stats查看存储过程执行信息

    原文:DBA工具--DMV--通过sys.dm_exec_procedure_stats查看存储过程执行信息 对于DBA来说,经常要手机存储过程的某些信息: 执行了多少次 执行的执行计划如何 执行的平 ...

  2. Swift 学习Using Swift mix and match, network: 写rss读者

    有使用第三方库.因此,需要使用mix and match财产. 请指出错误,谢谢! rss 阅读器,非常easy的代码.仅仅是为了学习swift语言而写. 1、BaseViewController.s ...

  3. 大约 C++ 几个方面分析--overload, override, overwrite, rewrite

    overload, override, overwrite, rewrite 这几个单词常常出如今 C++ 书中,翻阅一些译版后发现并未对 override, overwrite, rewrite 严 ...

  4. 【LeetCode从零单排】No15 3Sum

    称号 Given an array S of n integers, are there elements a, b, c in S such that a + b + c = 0? Find all ...

  5. MVC 分离Controllers-Views

    将MVC中的Controllers.Model和View分别放到单独的项目中 Model: 新建-项目-Windows-类库 MVCTest.Model Controller:新建-项目-Window ...

  6. 图解SSIS监视文件夹并自动导入数据

    原文:图解SSIS监视文件夹并自动导入数据 演示案例:让系统自动监视文件夹,并把文件夹下面的excel文件导入到sql中,之后清空目录.这个过程以往都需要写程序来实现或者定时执行,现在可以用ssis来 ...

  7. Spring AOP入门——概念和注意事项

    AOP什么? AOP在功能方面,它是之前和之后运行一些业务逻辑,一些操作(比方记录日志.或者是推断是否有权限等),这些操作的加入.全然不耦合于原来的业务逻辑.从而对原有业务逻辑全然是透明. 也就是说. ...

  8. CentOS7 安装NFS SSH免密码登陆

    配置5台虚拟机 ip为192.168.1.160 - 164,使用160作为共享服务器 使用yum安装nfs 以及rpcbind,有很多文章介绍,这里不再赘述 一.启动服务 1.启动rpcbind s ...

  9. 《学习opencv》笔记——矩阵和图像处理——cvAnd、cvAndS、cvAvg and cvAvgSdv

    矩阵和图像的操作 (1)cvAnd函数 其结构 void cvAnd( //将src1和src2按像素点取"位与运算" const CvArr* src1,//第一个矩阵 cons ...

  10. 【Android界面实现】可旋转的汽车3D模型效果的实现

    转载请注明出处:http://blog.csdn.net/zhaokaiqiang1992 今天要给大家介绍的是怎样实现可旋转的汽车3D模型. 先看实现效果 这仅仅是静态图,实际上,这个模型是能够依据 ...