2016-01-19 1 views
-2

Этот код работает на некоторых страницах, например klix.ba, но не может понять, почему он не работает для других.Ruby - nokogiri, open-uri - Не удалось разобрать страницу

Нет ошибки объяснить, что пошло не так, ничего.

Если помещается страница, это означает, что я могу настроить таргетинг на страницу и проанализировать ее, почему я не могу получить отдельные элементы?

require 'nokogiri' 
require 'open-uri' 


url = 'http://www.olx.ba/' 

user_agent = "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.0.7) Gecko/2009021910 Firefox/3.0.7" 


page = Nokogiri::XML(open(url,'User-Agent' => user_agent), nil, "UTF-8") 

#puts page - This line work 

puts page.xpath('a') 
+0

Вы разборе из XML, почему бы не разобрать HTML 'Nokogiri :: HTML (открыть (URL)' – Cyzanfar

+0

Добро пожаловать в Stack Overflow пожалуйста. прочитайте «[ask]» и «[mcve]». Нам нужно лучшее представление о проблеме. Что вы пробовали при отладке? Какие сайты работают, а что нет? –

+0

Извините, я не знал, что еще Это была странная проблема без каких-либо сообщений об ошибках, как я уже упоминал выше. Работает нормально на одной странице, но неудачно на другой. Затем @Phil M упоминает, что вызов XML, вероятно, вызывает проблему, и он был прав. – Cudoviste

ответ

1

Прежде всего, почему вы разбираете его как XML? должно быть правильным следующее, учитывая вашу страницу HTML является сайт:

page = Nokogiri::HTML(open(url,'User-Agent' => user_agent), nil, "UTF-8") 

Кроме того, если вы хотите вырезать все ссылки (a -tags), это как:

page.css('a').each do |element| 
    puts element 
end 
+0

Это 'каждый 'block не будет выделять ссылки. Он только итерации над t и печатает их. Вы должны изменить формулировку или добавить код, чтобы фактически удалить их. Но почему даже упоминать это, поскольку это не было частью вопроса. –

+0

Привет. Я понял OP как будто он хочет получить все теги a определенного веб-сайта ('puts page.xpath ('a')'). Вот почему я показал, как обращаться с a-тегом через css ('page.css ('a')'), который даст ему все a-элементы. Чтобы вывести указанный элемент (Да, весь элемент, как в 'Bar'), я использовал цикл '.each'. Надеюсь, что решает вопросы :) –

0

Если вы хотите, чтобы разобрать содержимое с веб-страницы, что вам нужно сделать это:

require 'nokogiri' 
require 'open-uri' 


url = 'http://www.olx.ba/' 

user_agent = "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.0.7) Gecko/2009021910 Firefox/3.0.7" 


page = Nokogiri::HTML(open(url,'User-Agent' => user_agent), nil, "UTF-8") 

#puts page - This line work 

puts page.xpath('a') 

Вот посмотрите на Nokogiri документации

Одна вещь, которую я хотел бы предложить, - использовать точку прерывания отладчика в вашем коде (возможно, после назначения page). Посмотрите на драгоценный камень Pry-debugger.

Так что я хотел бы сделать что-то вроде этого:

require 'nokogiri' 
require 'open-uri' 
require 'pry' # require the necessary library 


    url = 'http://www.olx.ba/' 

    user_agent = "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.0.7) Gecko/2009021910 Firefox/3.0.7" 


    page = Nokogiri::HTML(open(url,'User-Agent' => user_agent), nil, "UTF-8") 
    binding.pry # stop a moment in time in you code (break point) 

    #puts page - This line work 

    puts page.xpath('a')