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