What have you found for these years?

2009-02-11

feed parsing

再度令人嘆息,ruby feed parsing 居然這麼難搞...

rfeedparser 雖然強大,但看到這個就要放棄他了:

godfat ~/p/g/photos> gem dep rfeedparser
Gem rfeedparser-0.9.951
rchardet (>= 1.1, runtime)
hpricot (>= 0.6, runtime)
character-encodings (>= 0.2.0, runtime)
htmltools (>= 1.10, runtime)
htmlentities (= 4.0.0, runtime)
mongrel (>= 1.0.1, runtime)
addressable (>= 1.0.4, runtime)

神經病!居然還 depend on mongrel 咧。
而且我沒記錯的話,他連連接網路抓取 feed 資料都有。
作者大概沒聽過那句話 "write programs do one thing and do it well"

本來是打算用 hpricot 的,但他碰到測試 rss feed 居然 parse 錯誤。
該 feed 是有 CDATA 和 namespace, 有些 tag parse 不出來...

改用 nokogiri, 不過依然問題重重...
rss 是沒問題,但 atom 的 node selecting 卻讓我很困擾。
他必須在每一次的 xpath 中都指定 namespace!!!

doc.xpath('//ns:entry', {'ns' => 'http://www.w3.org/2005/Atom'})

棍!超煩的。找不到方法省略掉。改用 HTML parser 呢?
這樣就能省掉 namespace, 但碰到明白寫 namespace 的 rss 就爛掉了。
所以還是得用 XML parser... 但這樣好像就無論如何不能省 ns.

改用 css 咧?查了 css3 selector 的 spec, 用 | 指定 ns.
因為還是不能省 ns 啊... 結果 nokogiri 好像根本不支援 | 的樣子。

所以還是只好用 xpath + 不斷寫好長的 ns.
當然那個 hash 先記下來可以少打點字,但實在是...

然後最好笑的是,打:

doc.namespace

還會 segmentation fault.............. 這麼嚴重的 bug? orz

唉。

2 retries:

MidnightBlue said...

(拍) 我好久之前就覺得這真是難搞的事,好像也跟你討論過,主要原因是標準太多 (那還是標準嗎?)

godfat 真常 said...

所以想省掉麻煩就用 rfeedparser 吧? -_-b
這個相容性真的很強,就討厭了點就是

XML 真是罪過啊...
不過 HTML 更是讓人困擾就是了 :s

YAML 才是王道啊! XD

Post a Comment

All texts are licensed under CC Attribution 3.0