我决定尝试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。
谢谢。
答案 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
(我在空警告数组中放了一个空格,以防止它看起来像一个盒子。)