2009-07-15 54 views
1

我决定放弃引入nokogiri尝试,并从http://nokogiri.rubyforge.org/nokogiri/Nokogiri.html直接复制下面的程序(仅添加require 'rubygems'I_KNOW_I_AM_USING_AN_OLD_AND_BUGGY_VERSION_OF_LIBXML2常数):最基本的Nokogiri程序失败 - 文档问题或错误?

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。

谢谢。

+0

你使用的是什么版本的Ruby? – Chuck 2009-07-16 10:03:26

+0

红宝石1.8.6(2008-08-11 patchlevel 287)[universal-darwin9.0] – gauth 2009-07-16 17:42:40

回答

0

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

0

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

+0

只是为了确认:第一个代码段也适用于此。 – Chuck 2009-07-16 01:42:54

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>... 
0

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

截至今天(09年9月22日),这是目前在MacOS:(我把空警告阵列内的空间,以保持它看起来像一个盒子)

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

libxml: 
    compiled: 2.7.4 
    loaded: 2.7.4 
    binding: extension