好读版:
http://myweb.ncku.edu.tw/~c34031328/diary/obml.html
[Opera_mini] 是 opera 公司推出的适合手机的浏览器,
但其实 *她* 并不解析 [HTML] 。
她的运作必需依赖 Opera 公司的服务器,
将网页由 HTML 格式转换成 **OBML** 格式;
同时大幅缩小网页大小。
后再由 opera mini 解析、排版。
固她才可以 [绕过色情守门员] 。
[绕过色情守门员]: http://myweb.ncku.edu.tw/~c34031328/diary/man.html
OBML 格式全名 *Opera Binary Markup Language* ,
是由 opera 公司所开发,针对 HTML 简化格式。
她并不全是文字,其中内含了一些二进制码,
用来表示某段文字是的格式。(像超连结、标题、颜色。)
尝试以纯文字读取会有部份乱码。
(或全部乱码。我以 [more] 或 [less] 读取时
二进制会显示为乱码,文字就保有文字。
别的工具有没有这么聪明我就不确定了。)
另外我不知道为什么,
我的 OBML 档副档名不是 `*.obml` , 而是 `*.obml16` .
反正没差,可以看就好了,以下仍称 `*.obml` .
但读者请自行确认自己的是 `*.obml` 或 `*.obml16` .
## 前言 ##
在旧手机上只用 opera mini .
而又旧手机除了上网也没什么能做的;
固上面就积了一堆 *储存* 来离线看的网页。
最近换手机,想把这 *脱拉库* 东西抓出来,
转换成方便的格式。于是搜寻了一下,记录流程。
## 取出 obml 档 ##
首先取得 root 权限;没有的话用 adb 也可以。
( adb 能取得 root 权限。)
目标是把存在内部空间的 obml 档复制出来。
以我来说路径是:
`/data/data/com.opera.mini.android/files/*.obml`
我的档案名是一串七或八个数字,副档名 obml .
### 使用 adb ###
** 无须 root 权限 **
$ adb root pull "/data/data/com.opera.mini.android/files"
# 拉出整个目录
$ adb root pull "/data/data/com.opera.mini.android/files/*.obml"
# 拉出特定档案
不会 adb 的请自己 google.
( 或等我有空写一篇文章;但不做别人做过的事是我的原则:P
网络上这么多教学了……。)
### 使用 root explore ###
** 必须取得 root 权限 **
随便找一款支援 root 的档案管理员,
进到你的 opera mini 的资料夹。
四处看看,把副档名是 obml 的档案都复制到 sdcard
或其它你方便的地方。
然后再复制回电脑里。
## 将 `*.obml` 转换成 `*.html` ##
google 大神与 SlackOverFlow ,
都只推荐用 Java 虚拟机器可以在电脑跑 Opera mini .
但我认为这样还是很不方便。
希望可以转成 HTML , PDF , 或者纯文字也可以。
于是在 github 上找到这东西: [obml-parser] .
可以把 OBML 转换回 HTML .
(同场加映,同位作者写的 [OBML 语法介绍] 。
如果有兴趣的话可以读。)
[obml-parser]: https://github.com/grawity/hacks/blob/master/hacks/Text/obml-parser
[OBML 语法介绍]: https://gist.github.com/grawity/702b31cddcc5a6622724/a00d1b072e7d7344488e4d1b6cae7ab3a14b2399
** 用 [python] 写得,所以你得要有 python 才行。 **
(或等某个好心人把它转成可执行档;
"" 别看我,我不会 python . "" )
请用 python3 或以上,我也不知道为什么。
"" 我说过我不会 python. ""
因为我 [fedora] 23 , 直接打 python 是对应到 python2.X ,
然后 python2.X 说我的档案没有宣告编码。(???)
python3 就不会;所以我指令下 python3 .
(感觉是如果档案内有用到 *非 ASCII* 要宣告,
不然 python2.X 直译器会报错。)
python3 obml-parser *.obml
ls # 显示 *.obml *.obml.html
# 原本只有 `*.obml` ,
# 多出 `*.obml.html` .
在放 obml 的目录下会生成一个
`*.obml.html` 的档案,
可以直接用浏览器看。
## 糟糕的 HTML ##
打开后和用 opera mini 看一样……;
就是只有 6, 7 公分宽, [像这样] 。
如果不给看或看起来很奇怪,可以看一下原始码。
它的 HTML 很糟……,完全没有结构。
(没有 `<html>` , `<head>` , `<body>` , 全部混在一起。)
[像这样]: http://myweb.ncku.edu.tw/~c34031328/study/html/opera_mini/54613806.obml16.html
而且还宣告了 `<!DOCTYPE html>` ...,
要求浏览器以标准的语法来剖析该文件。
(如果没有宣告,浏览器会以 [怪异模式] 来剖析 HTML .
这样就算语法不正确,看起来也 *还可以* 。)
### tidy 拯救混乱的 HTML ###
[tidy] 是 w3c 开启的一开源专案,
该程式会尝试修正不正确的 HTML 语法;
并重新排版。如果你的浏览很挑食,
拒绝 *obml-parser* 所生出的 HTML ,
可以试试这招。
"" 虽然我的 firefox 看起来都一样。 ""
tidy 前:
http://myweb.ncku.edu.tw/~c34031328/study/html/opera_mini/54613806.obml16.tidy.html
tidy 后:
http://myweb.ncku.edu.tw/~c34031328/study/html/opera_mini/54613806.obml16.html
** 注意! **
*我的版本* 的 tidy 会默认将输入视为 ASCII ,
但很遗憾 *obml-parser* 所转出来的是 **UTF-8** .
所以你需要指定编码;或指定不处理编码问题。
tidy -raw *.obml.html > *.obml.tidy.html
# 不处理编码
tidy -utf8 *.obml.html > *.obml.tidy.html
# 指定 UTF-8