先前我一直用 plurk-list 這個 php 小程式從噗浪所提供的 rss 來備份我自已的噗浪。 可是最近突然失效了。 原來是噗浪的 rss 格式有小的變動, 時間順序變顛倒了。 反正我本來就不喜歡 php 語言, 乾脆整個重寫。 Rss 是 xml 格式, 但是處理 xml 格式的程式寫起來很囉嗦。 秉持著 長線投資的電腦學習策略 所建議的 「以檔案格式為核心」 的思考原則, 決定先把 xml 轉成 json 再來處理, 畢竟有 jq 瑞士刀 可以處理 json 檔, 而且 json 格式在許多語言裡面直接對應到普通陣列與關聯陣列, 處理起來方便多了。
[2024/5/28] 發現比 xml-js 更簡單的 xq。 可以省略一、二節,直接跳到第三節。
一、 xml 轉 json
我們拿噗浪的 rss 檔來作為 xml 資料檔的範例, 例如 ckhung0 最近的噗。
實際上我是每週備份: (寫在一個被 cron 呼叫的 script 裡面):
wget http://www.plurk.com/ckhung0.xml -O
/home/ckhung/plurklogs/$(date '+%y%W').xml
這樣就會產生一堆 *.xml 檔。
作實驗當然沒空等 cron, 大家可以改下載好幾位用戶的 rss,
以下假設你已準備好 ckhung0.xml、 davelin.xml、
MGdesigner.xml、 aboutfish.xml 等等。 (只是拿我的噗友舉例)
搜尋 xml 轉 json 時, 遇到 這一頁下載趨勢比較圖 , 那就決定從眾採用 xml-js 了:
sudo npm install -g xml-js xml-js 2117.xml --compact # 輸出擠成一團,不好讀 xml-js 2117.xml --compact | jq . # 用 jq 縮排, 漂亮多了
根據 官網的說明, 處理比較複雜的 xml 時, 不能指定精簡輸出模式 --compact 。 我們的 rss 很簡單, 當然就採用 --compact 囉。
很多類型的檔案其實都是 xml 檔, 例如 svg 就是。
不過必須先把檔名改成 ,xml , xml-jq 才願意轉檔。
比方說把
這張圖 存檔命名為 graphic-workflow.xml 就可以抓出
svg 圖片當中大多數 「被楕圓形圈起來的文字」:
xml-js graphic-workflow.xml --compact | jq '.svg.g.g |
map([.title._text, .ellipse]) | map(select(.[1]!=null)) | map(.[0])'
有一些抓不到, 是因為製圖時採用不同的順序。
隨便啦, 總之這一段的重點是: xml-jq 可以把
svg、 xhtml、 mathml、 gpx、 kmx 等等各種 xml 檔轉成 json,
然後 jq 就可以接手。
二、 jq 批次串接多個檔
回到噗浪的 rss。 假設已有很多個 xml 檔, 裡面個含有許多筆噗, 我們想把全部的噗全部塞進一個 json 檔, 該怎麼做? 先把所有的 xml 轉成 json:
for f in *.xml ; do xml-js $f --compact | jq . > ${f/%xml/json} ; done # 或是這樣也可以 (建議第一次做先不要 pipe 給 bash, 先查看印出來的指令是否正確) ls *.xml | perl -ne 'print "xml-js $1.xml --compact | jq . > $1.json\n" if /(.*)\.xml/' | bash
要合併兩三個檔案可以這樣做:
jq -s '.[0].feed.entry + .[1].feed.entry + .[2].feed.entry' \ ckhung0.json davelin.json MGdesigner.json
你可以在最後面接上 | jq 'length'
數一下串起來的結果是否筆數正確。
但是如果有三十個或三百個檔要串接呢?
jq 有一個強大的 reduce 功能:
jq -s 'reduce .[] as $item ([]; . + $item.feed.entry)' *.json | jq length
不過因為我用 cron 定期抓回來的 rss 裡面會有重覆的資料, 還要處理輸出格式的問題, 所以不適合全程用 jq 做。 還是寫 python 程式好了。
三、 噗浪的 rss => json 再轉 html
[2024/5/28] 發現比 xml-js 更簡單的 xq, 所以改寫了 prj2html.py 。 總之,轉檔的步驟沒什麼變, 只是中間的工具從 xml-js 改成 xq:
for f in *.xml ; do xq . $f > ${f/%xml/json} ; done python3 prj2html.py *.json > new.html
然後就可以手動編輯 new.html 再把它貼到你的噗浪 html 備份了。
沒有留言:
張貼留言
因為垃圾留言太多,現在改為審核後才發佈,請耐心等候一兩天。