ここにいくつかの奇妙さのサンプルがあります:
#!/usr/bin/ruby
require 'rubygems'
require 'open-uri'
require 'nokogiri'
print "without read: ", Nokogiri(open('http://weblog.rubyonrails.org/')).class, "\n"
print "with read: ", Nokogiri(open('http://weblog.rubyonrails.org/').read).class, "\n"
これを実行すると、次が返されます。
without read: Nokogiri::XML::Document
with read: Nokogiri::HTML::Document
戻り値 XMLがなく、read
それがあると HTML ですか? Web ページは「XHTML トランジショナル」として定義されているため、最初は Nokogiri がストリームから OpenURI の「content-type」を読み取っていたに違いないと思っていましたが、次のように返されます'text/html'
。
(rdb:1) doc = open(('http://weblog.rubyonrails.org/'))
(rdb:1) doc.content_type
"text/html"
これはサーバーが返すものです。だから、今、Nokogiri が 2 つの異なる値を返す理由を理解しようとしています。テキストを解析し、ヒューリスティックを使用してコンテンツが HTML か XML かを判断しているようには見えません。
そのページが指す ATOM フィードでも同じことが起こっています。
(rdb:1) doc = Nokogiri.parse(open('http://feeds.feedburner.com/RidingRails'))
(rdb:1) doc.class
Nokogiri::XML::Document
(rdb:1) doc = Nokogiri.parse(open('http://feeds.feedburner.com/RidingRails').read)
(rdb:1) doc.class
Nokogiri::HTML::Document
HTML かフィード (RSS または ATOM) かを事前に知らなくても、ページを解析して、それがどちらであるかを確実に判断できる必要があります。HTML または XML フィード ファイルの本文を解析するよう Nokogiri に依頼しましたが、一貫性のない結果が表示されます。
タイプを判別するテストをいくつか書けると思ったのですが、要素を見つけられない xpath に出くわしましたが、通常の検索は機能しています。
(rdb:1) doc = Nokogiri.parse(open('http://feeds.feedburner.com/RidingRails'))
(rdb:1) doc.class
Nokogiri::XML::Document
(rdb:1) doc.xpath('/feed/entry').length
0
(rdb:1) doc.search('feed entry').length
15
xpaths は XML で動作すると考えましたが、結果も信頼できるものではありません。
これらのテストはすべて私の Ubuntu ボックスで行われましたが、Macbook Pro でも同じ動作が見られました。何か間違ったことをしていることを知りたいのですが、一貫した結果が得られる解析と検索の例を見たことがありません。誰かが私のやり方の誤りを教えてくれますか?