这是一些奇怪的示例:
#!/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 过渡”,所以起初我认为 Nokogiri 一定是从流中读取 OpenURI 的“内容类型”,但返回'text/html'
:
(rdb:1) doc = open(('http://weblog.rubyonrails.org/'))
(rdb:1) doc.content_type
"text/html"
这是服务器返回的内容。所以,现在我想弄清楚为什么 Nokogiri 返回两个不同的值。它似乎没有解析文本并使用启发式方法来确定内容是 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 上看到了相同的行为。我很想知道我做错了什么,但我还没有看到一个解析和搜索的例子,它给了我一致的结果。谁能告诉我我的方式的错误?