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