2013-09-10 4 views
1

У меня есть проблемы с получением данных с использованием nokogiri с этим кодом:Получить данные из JQuery

def run 
    # load HTML content to doc 
    doc = Nokogiri::HTML(open(@link)) 
    cells = doc.css('div#z_full_column > div.content') 
    puts cells # just to see what i've got while running code 
end 

с этого сайта:

http://www.staples.com/sbd/cre/marketing/back-to-school/back-to-school-deals/weekly-deals.html

Все данные ушли. Я вижу только <div class="content"></div>. Я пытался поставить sleep 5 в каждый код, но это бесполезно. Возможно, проблема здесь вызвана jquery.

ответ

1

Перейти к этому URL в адресной строке браузера, а затем посмотреть на HTML в браузере с помощью View> Source (или сравнимой), затем Edit> Find и введите class="content", и вы увидите это:

<div class="content"></div> 



</div> 

Затем, если вы расчесываете все скрипты Javascript, включенные на страницу, вы, вероятно, найдете тот, который добавит некоторый контент к этому <div>. Nokogiri понятия не имеет, что делает JavaScript для исходного HTML.

1

Проблема заключается в линию, которую я предполагаю, от класса OpenURI:

open(@link) 

К сожалению, OpenURI не поддерживает JavaScript. Это означает, что что-либо на странице, загружаемой через jQuery, не будет видно OpenURI. Это значит, что загруженный JavaScript/jQuery контент не передается в Nokogiri.

Я бы предложил переключиться на драгоценный камень, который поддерживает управление настоящим браузером, который будет поддерживать JavaScript. Некоторые из популярных драгоценных камней включают Watir, Selenium-Webdriver и Capybara. Я предпочитаю Watir из-за его интуитивно понятного API.

Ваш пример использования Watir будет:

require 'watir' 

# Open a firefox browser 
browser = Watir::Browser.new :firefox 

# Go to the url 
browser.goto 'http://www.staples.com/sbd/cre/marketing/back-to-school/back-to-school-deals/weekly-deals.html' 

# Get the name of the displayed products 
products = browser.div(:class => 'content').divs(:class => 'z_prod_mod') 
puts products.collect{ |p| p.h3.text } 
#=> Staples® 1-subject notebook, 8" x 10.5", wide rule, 70 sheets 
#=> "RoseArt ® crayons, 24/pack 
#=> etc 

# Close the browser 
browser.close 
+0

[OpenURI] (http://ruby-doc.org/stdlib-2.0.0/libdoc/open-uri/rdoc/index.html) ISN Это драгоценный камень, это часть Ruby's Std-lib. «open-uri не поддерживает javascript»? OpenURI не заботится о том, каков контент, он только извлекает то, что возвращается ему. Что мы делаем с этим контентом, зависит от нас. Если JavaScript возвращается, OpenURI вернет его. Проблема с кодом OP заключается в том, что Nokogiri не будет анализировать JavaScript. –

+0

Приятный, но он работает медленно, потому что он должен открыть браузер –

Смежные вопросы