Как я могу заставить Nokogiri разобрать и вернуть XML-документ?

Вот пример какой-то странности:

#!/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

Безread возвращает XML, а с ним есть HTML? Веб-страница определена как «переходная XHTML», поэтому сначала я подумал, что Нокогири, должно быть, читал «тип контента» OpenURI. из потока, но это возвращает'text/html':

(rdb:1) doc = open(('http://weblog.rubyonrails.org/'))
(rdb:1) doc.content_type
"text/html"

это то, что сервер возвращает. Итак, теперь я пытаюсь выяснить, почему Нокогири возвращает два разных значения. Похоже, что он не выполняет синтаксический анализ текста и использует эвристику, чтобы определить, является ли контент 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) и надежно определять, что это такое. Я попросил Nokogiri проанализировать тело файла фида HTML или XML, но я вижу эти противоречивые результаты.

Я думал, что мог бы написать несколько тестов для определения типа, но потом я столкнулся с xpaths, не находящими элементы, но работающими при регулярном поиске:

(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. Мне бы очень хотелось узнать, что я делаю что-то не так, но я не видел пример синтаксического анализа и поиска, который давал бы мне последовательные результаты. Может кто-нибудь показать мне ошибку моих путей?

Ответы на вопрос(2)

Ваш ответ на вопрос