ruby при загрузке содержимого всегда пуст - PullRequest
0 голосов
/ 01 февраля 2011

Я так расстроен, пытаясь использовать Ruby для извлечения определенного URL-адреса.

Я пробовал много разных способов, таких как open-uri, стандартный запрос до сих пор не работал. Я всегда получаю пустой HTML. Я также пытался использовать python для получения того же URL-адреса, который всегда возвращал правильное HTML-содержимое.Я действительно не уверен, почему ... Пожалуйста, помогите, так как я новичок и в Ruby, и в Python ... Я хочу использовать Ruby (предпочитаю аккуратный синтаксис и удобные имена функций, проще устанавливать библиотеки с использованием gem и homebrew(на mac) чем python easy_install) но я сейчас рассматриваю Python, потому что он просто работает (но все еще пытаюсь разобраться с проблемами 2.x и 3.x).Я могу делать что-то действительно глупое, но я думаю, что это очень маловероятно.

ruby 1.9.2p136 (2010-12-25 revision 30365) [i386-darwin10.6.0]

Реализация 1:

url = URI.parse('http//:www.stackoverflow.com/') req = Net::HTTP::Get.new(url.path)
res = Net::HTTP.start(url.host, url.port) {|http|   http.request(req) }    
puts res.body #empty

Реализация 2:

doc = Nokogiri::HTML(open("http//:www.stackoverflow.com/", "User-Agent" => "Safari"))
#empty
#I tried to use without user agent, without Nokogiri none worked.

Реализация Python, которая каждый раз работала идеально

f = urllib.urlopen("http//:www.stackoverflow.com/")
# Read from the object, storing the page's contents in 's'.
s = f.read()
f.close()

print s

Ответы [ 2 ]

5 голосов
/ 01 февраля 2011

Если это ваш точный код, он недействителен по нескольким причинам.

  1. http: должно быть http://
  2. URL нужен путь.если вам нужна корневая страница example.com, она должна быть http://example.com/, косая черта имеет значение.
  3. , если вы поместите 2 строки кода в одну строку, которую вам нужно использовать;для обозначения конца первой строки

SO

require 'net/http'

url = URI.parse('http://www.yellowpages.com.au/search/listings?clue=plumber&locationClue=Australia')
req = Net::HTTP::Get.new(url.path)
res = Net::HTTP.start(url.host, url.port) {|http|   http.request(req) }    
puts res.body

То же самое верно для использования open в nokogiri

РЕДАКТИРОВАТЬ: этот сайт возвращает плохие результаты многовремена:

counter = 0

20.times do
  url = URI.parse('http://www.yellowpages.com.au/search/listings?clue=plumber&locationClue=Australia')
  req = Net::HTTP::Get.new(url.path)
  res = Net::HTTP.start(url.host, url.port) {|http|   http.request(req) }    
  sleep 1
  counter +=1 unless res.body.empty?
end

puts counter

для меня это возвращалось только один раз, когда не пустое тело.Если вы заменяете на другом сайте, он работает все время

curl "http://www.yellowpages.com.au/search/listings?clue=plumber&locationClue=Australia"

Дает те же противоречивые результаты.

2 голосов
/ 01 февраля 2011

Два примера с openURI (стандартная библиотека lib), обертка для (среди прочего) довольно громоздкого Net :: HTTP:

require 'open-uri'

open("http://www.stackoverflow.com/"){|f| puts f.read}

puts URI::parse("http://www.google.com/").read
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...