因为之前的文章,wordpress直接用了中文做别名,这样以别名为固定链接的设置就会导致URL不是那么的友好,而且wordpress还不会去掉中文标点,所以感觉有点怪怪的。今晚写个脚本,利用网上的翻译引擎,把我博客的所有中文别名都翻译为英文。这样就可以用英文的URL作为固定链接来定位我的文章了。
1、导出数据库
暂时只做一个测试,所以我把wp的数据库从服务器上dump出来,然后下载到本机。
mysqldump -uroot -p xiaoxia > blog.sql
tar zcf blog.tar.gz blog.sql
2、导入到本地的mysql中
mysql> create database xiaoxia;
mysql> use xiaoxia;
mysql> source blog.sql;
3、导出别名
编写php脚本把所有别名导出到文本中,以作翻译。同时ID也要取出来,方便到时候更新到数据库。
setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $fp = fopen("output.txt", "w"); assert($fp != null); $r = $db->query("select ID, post_name from wp_posts"); while($row = $r->fetch()){ if(strpos($row["post_name"], '%')===FALSE) continue; fwrite($fp, $row["ID"] . "^^^^" . urldecode($row["post_name"]) . "\n"); echo "ID: " . $row["ID"] . "\n"; } fclose($fp);
这里仅把含有中文的别名导出来。因为wordpress在别名里保存的是urlencoded的字符串,所以我们可以大致可以通过检查是否含有%符号来确定是否含有中文字符。我使用^^^^作为ID和别名的分隔符,当然可以使用换行或者其他别名里不会包含的字符。
执行php脚本。
root@xiaoxia-pc:~# php -f read.php
ID: 3318
ID: 2
ID: 5
ID: 6
ID: 15
ID: 16
ID: 17
ID: 18
ID: 19
ID: 20
…
导出的文件内容:
3318^^^^一句话
2^^^^关于
5^^^^语音朗读助手
6^^^^本站新开张,希望大家热烈支持!
15^^^^程序设计-visual-basic教程
16^^^^梦幻日记本
17^^^^汉语小词典
18^^^^网络文件同步系统v1-6
19^^^^2005年7月的日记
20^^^^文件发送控件
21^^^^电脑小管家1-0
…
4427^^^^一道c语言趣味题
4447^^^^kde-gnome的历史-图展
4493^^^^写编译器:学习gnu-flex,写一个词法分析器
4487^^^^又恢复了以前的工作环境了
4512^^^^自动草稿
4518^^^^阿斯发送到方萨芬撒旦方速度
4、翻译别名
网上开放的在线翻译引擎有很多,众所周知的是Google Translate,不过它越来越不厚道了。Google会对频繁的请求进行制止,把你的IP加入黑名单。这样要等一段时间才能再使用它的服务。下面使用的是百度的在线翻译。
代码用python写,因为我不是很懂php里怎么写网站请求。
# -*- coding: utf8 -*- import urllib, json fin = file("output.txt", "r") fout = file("output2.txt", "w") for line in fin.readlines(): ID, name = line.split("^^^^") data = { "query" : name, "from":"zh", "to":"en", "token" :"d89e4a4b091302fb4ed2bcfacde86553", "source" : "txt", "ie" : "utf-8" } r = urllib.urlopen("http://fanyi.baidu.com/transcontent", urllib.urlencode(data)) t = r.read() c = json.loads(t) if c["status"] != 0: print "failed to translate:", t t = c["data"][0]["dst"] print ID, t fout.write(ID + "^^^^" + t + "\n") print "finish" fout.close()
执行这段脚本,得到翻译的结果。
root@xiaoxia-pc:~# python fanyi.py
3318 In a word, yes
2 About
5 A voice reading assistant
6 The newly opened, I hope everyone support!
15 Program design of Visual-Basic tutorial
16 Dream diary
17 Chinese small dictionary
18 Network file synchronization system based on v1-6
19 2005 diary of July
20 File control
21 A computer small housekeeper 1-0
…
4427 A C language interesting questions
4447 The history of kde-gnome – graph Expo
4493 Writing a compiler: learning gnu-flex, write a lexical analyzer
4487 Returned to previous work environment.
4512 Automatic draft
4518 Aspen is sent to the Safin Satan square velocity
finish
5、修饰别名
很明显,导出的结果中,有很多名称是不符合想要的效果的,例如,各种标点以及很多空格。我只想别名里含有小写字母、数字以及‘-’,对于做固定链接来说,空格也是不允许出现的,不然很难看。
下面写一段python脚本来处理以下这些结果。
fin = file("output2.txt", "r") fout = file("output3.txt", "w") for line in fin.readlines(): ID, name = line.split("^^^^") # To lower name = name.lower() # remove chars except digit & alpha name = "".join([(x if x.isalnum() else " ") for x in name]) # rebuild with '-' parts = name.split(" ") while "" in parts: parts.remove("") name = "-".join(parts) # ok print ID, name fout.write(ID + "^^^^" + name + "\n")
执行脚本,
root@xiaoxia-pc:~# python decorate.py
3318 in-a-word-yes
2 about
5 a-voice-reading-assistant
6 the-newly-opened-i-hope-everyone-support
15 program-design-of-visual-basic-tutorial
16 dream-diary
17 chinese-small-dictionary
18 network-file-synchronization-system-based-on-v1-6
19 2005-diary-of-july
20 file-control
21 a-computer-small-housekeeper-1-0
…
4427 a-c-language-interesting-questions
4447 the-history-of-kde-gnome-graph-expo
4493 writing-a-compiler-learning-gnu-flex-write-a-lexical-analyzer
4487 returned-to-previous-work-environment
4512 automatic-draft
4518 aspen-is-sent-to-the-safin-satan-square-velocity
6. 导入到wp数据库
这是最后一个步骤了,对于数据库的操作,还是用回php比较方便。
setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $data = file_get_contents("output3.txt"); $lines = explode("\n", $data); foreach($lines as $line){ if($line == "") continue; $parts = explode("^^^^", $line); $ID = $parts[0]; $name = $parts[1]; /* 检查是否有同名 */ while($db->query("select ID from wp_posts where post_name='$name'")->fetch()){ $name .= "-"; } $db->query("update wp_posts set post_name='$name' where ID=$ID"); echo "Update " . $ID . "\n"; } echo "Finished";
在导入回数据库的时候,我检查了别名是否唯一,否则在后面添加-符号。我觉得最好还是保持唯一吧,这样就可以用别名来定位一篇文章。
7. 小结
很高兴,成功地完成了任务!虽然百度翻译的结果相比Google Translate来说水平还是相差甚远。但在这个过程中,让我再次熟悉了使用php、python等脚本语言,提高了用脚本轻松解决我所遇到问题的能力。
哈哈,改投 wordpress 了~~
。。。搞错了,以前也是的。。。
嗯,不过很久以前就不是了。
说不定我有空了,再自己写一个博客程序 🙂
呵呵,Python真的是个好东东,我也在小虾的影响下才开始学的……
嗯,python里操作mysql好像不是很方便,所以我才考虑用了php的。我对这些脚本的字符处理函数也不是很熟悉,用到的时候再上网查一下。python和php的官网都有很不错的在线手册!!!
我也改版Blog了,哈哈。。。
不过依然没脱离微软的东西。
“用脚本轻松解决我所遇到问题”,这句话很熟悉。 大概是某个Python教程上反复提到的话。
原来是你博客在改版???我之前上了几次,发现只剩下一个简历。你是不是要去实习了呢!
你现在大三吧? 我已经实习过了,在淘宝公司。 之前也拿到了百度和其他公司的offer,只是没有打算去。
你呢? 最近可一切都好?
恩,正在大三。哇,原来你去了淘宝实习啊,不知道你实习的是什么职位。有大公司不去,你打算干什么呢?
我最近做这做那的,手头上有很多事情还没有搞好,心里又想跟着兴趣走,o(∩∩)o…哈哈!!!都是网络方面的。
php读网页用fopen可以吧
嗯,好像是,不过我更熟悉Python,用自己熟悉的工具,会节约很多时间!
orz!
用wordpress具体怎么设置呢?