最基本的Nokogiri计划失败 - 文档问题还是错误?

时间:2009-07-15 22:02:25

标签: ruby rubygems nokogiri

我决定尝试Nokogiri,并直接从http://nokogiri.rubyforge.org/nokogiri/Nokogiri.html复制以下程序(仅添加require 'rubygems'I_KNOW_I_AM_USING_AN_OLD_AND_BUGGY_VERSION_OF_LIBXML2常量):

require 'rubygems'
I_KNOW_I_AM_USING_AN_OLD_AND_BUGGY_VERSION_OF_LIBXML2 = 1
require 'nokogiri'
require 'open-uri'

# Get a Nokogiri::HTML:Document for the page we’re interested in...

doc = Nokogiri::HTML(open('http://www.google.com/search?q=tenderlove'))

# Do funky things with it using Nokogiri::XML::Node methods...

####
# Search for nodes by css
doc.css('h3.r a.l').each do |link|
  puts link.content
end

没有返回任何结果。但是当我改变了

    doc = Nokogiri::HTML(open('http://www.google.com/search?q=tenderlove'))

    doc = Nokogiri::HTML(open('http://www.google.com/search?q=tenderlove').read)

该计划按预期工作。请注意,唯一的区别是在行尾添加了.read。我自己也永远不会想到这一点,因为几乎所有的示例代码都会脱离.read。包含它的一个地方,具有讽刺意味的是一个Nokogiri开发人员的帖子(http://tenderlovemaking.com/2008/11/18/underpant-free-excitement)。 API中的某些内容是否发生变化?我错过了什么?

我正在使用Nokogiri 1.3.2。

谢谢。

4 个答案:

答案 0 :(得分:0)

我将您的(原始)代码复制并粘贴到Ruby文件中并在我的系统上运行(ruby 1.8.6p369,Nokogiri 1.3.2),它运行正常。您的环境中是否还有其他可能导致问题的原因?除了Nokogiri,open('http://www.google.com/search?q=tenderlove')会为你回报什么?

答案 1 :(得分:0)

不确定您的问题是什么,但对open的来电是open-uri而非nokogiri。所以做一些尝试将nokogiri从游戏中解脱出来。

$ irb
>> require 'open-uri'
=> true
>> f = open('http://www.google.com/search?q=tenderlove')
=> #<File:/var/folders/LA/LACsuKOVHtaEgmBzsJcGAE+++TI/-Tmp-/open-uri.7455.0>
>> f.read
=> "<!doctype html><head><title>tenderlove - Google Search</title>...

答案 2 :(得分:0)

我升级到Nokogiri 1.3.3,并将libxml2升级到2.7.3。我不再需要使用荒谬的I_KNOW_I_AM_USING_AN_OLD_AND_BUGGY_VERSION_OF_LIBXML2 = 1语句来避免错误消息,并且该程序在没有无关的.read的情况下工作。

答案 3 :(得分:0)

检查你的Nokogiri和libxml版本以确保它们是最新版本总是好的。

截至今天(9/22/09),这是MacOS的最新消息:

nokogiri -v
--- 
nokogiri: 1.3.3
warnings: [ ]

libxml: 
  compiled: 2.7.4
  loaded: 2.7.4
  binding: extension

(我在空警告数组中放了一个空格,以防止它看起来像一个盒子。)