Сбой основной программы Nokogiri - проблема с документацией или ошибка? - PullRequest
1 голос
/ 16 июля 2009

Я решил попробовать 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 голосов
/ 22 сентября 2009

Всегда хорошо проверить вашу версию Nokogiri и libxml, чтобы убедиться, что они актуальны.

На сегодняшний день (22.09.09) это актуально для MacOS:

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

libxml: 
  compiled: 2.7.4
  loaded: 2.7.4
  binding: extension

(Я помещаю пробел внутри пустого массива предупреждений, чтобы он не выглядел как коробка.)

0 голосов
/ 16 июля 2009

Не знаю, в чем ваша проблема, но звонок на 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 голосов
/ 24 августа 2009

Я обновился до Nokogiri 1.3.3 и обновил libxml2 до 2.7.3. Мне больше не нужно использовать нелепый оператор I_KNOW_I_AM_USING_AN_OLD_AND_BUGGY_VERSION_OF_LIBXML2 = 1, чтобы избежать сообщений об ошибках, и программа работает без посторонних .read.

0 голосов
/ 16 июля 2009

Я скопировал и вставил ваш (оригинальный) код в файл Ruby и запустил его в моей системе (ruby 1.8.6p369, Nokogiri 1.3.2), и он работал нормально. Может ли быть что-то еще в вашей среде, что может быть причиной проблемы? Нокогири, кроме того, что open('http://www.google.com/search?q=tenderlove') возвращает для вас?

...