2016-10-10 3 views
1

Я пишу программу, чтобы загрузить изображения из Imgur альбома: Я только начал писать реальное изображение-ссылку-код:Как очистить в Ruby, когда элементы страницы продолжают меняться и перемещаться.

#The imports. 
require 'open-uri' 
require 'nokogiri' 

url = ARGV[0] 

#The title. 
open(url) do |f| 
    $doc = Nokogiri::HTML(f) 
    title = $doc.at_css('title').text.strip.clone 
    re = /\/[a]\/\w{5}/ 
    s2 = url.match re 
    puts title 
    puts s2 
end 



href = $doc.xpath("//img") 
puts href 

Когда я столкнулся с серьезной проблемой: страницы, загрузить не является источником страницы.

Например: Этот альбом: http://imgur.com/a/tGRvr/layout/grid имеет следующий код для его изображения:

<span class="post-grid-image pointer" data-href="//i.imgur.com/zh6I7k2.png" data-title="" style="transform: translate(0px, 0px) scale(1); z-index: 0; background-image: url(&quot;//i.imgur.com/zh6I7k2b.jpg&quot;);"></span>

И все же, когда я смотрю в исходном коде страницы, или запустить код для пролетных элементов, все изображения отсутствует:

  <div class="post-images is-owner"> 









      <div class="post-action nodisplay"></div> 

      </div> 
     </div> 

HTML, является активным, и изменения на основе, как мой браузер. В источнике страницы нет изображений, и все загружается с использованием какой-то странной java-системы. Как я могу очищать активные элементы, когда нет никаких активных элементов для очистки?

И в чем разница между inspect и 'view-source'? Вот так началась вся эта проблема.

ответ

1

Это динамический HTML. Механизация и/или Nokogiri не могут помочь вам, если вы не можете создать окончательную версию страницы, а затем передать ее им.

Вместо этого вы должны использовать что-то, что может интерпретировать JavaScript и применять CSS, такие как браузер. Проект WATIR будет первым делом, чтобы исследовать. «проверка» и «просмотр-источник» отражают страницу после того, как браузер обработал JavaScript и CSS, что часто не имеет никакого отношения к тому, как выглядела фактическая страница до этого. Поиск SO для [ruby] [watir].

Используйте wget, curl или nokogiri, чтобы получить страницу, чтобы вы могли видеть необработанный HTML-код.

$doc.at_css('title') должен использовать метод title: doc.title.

Не используйте глобальное значение $doc. Узнайте о области видимости переменных, а затем решите, подходит ли глобальный путь.

Вместо open с блоком:

open(url) do |f| 
    $doc = Nokogiri::HTML(f) 
    title = $doc.at_css('title').text.strip.clone 
    re = /\/[a]\/\w{5}/ 
    s2 = url.match re 
    puts title 
    puts s2 
end 

ли это вместо:

doc = Nokogiri::HTML(open(url)) 
title = doc.title 

При работе с URIs/URL, используйте встроенный класс URI, так как это хорошо отлажена инструмент:

require 'uri' 

url = URI.parse('http://imgur.com/a/tGRvr/layout/grid') 

url.path # => "https://stackoverflow.com/a/tGRvr/layout/grid" 
    .split('/') # => ["", "a", "tGRvr", "layout", "grid"] 

Зная, что вы можете сделать:

url.path.split('/')[2] # => "tGRvr" 
+0

Спасибо. Одна из проблем: URL-адрес не всегда будет «http: // imgur.com/a/tGRvr/layout/grid», есть много URL-адресов, которые я мог бы получить и ввести, это то, для чего используется регулярное выражение. –

+0

Мы не можем вам помочь, если вы не предоставите эту информацию, когда не задаете вопрос после появления ответов; Выполнение этого после того, как мы ответили, тратит наше время. Тем не менее, использование URI по-прежнему является лучшим маршрутом.Независимо от того, что возвращает «путь», вам будет необходимо разместить в вашем коде. Поддержание регулярного выражения может быть намного хуже, чем добавление крошечного фрагмента кода для извлечения третьего, или второго или любого другого, на основе хоста или какой-либо другой информации. –

+0

Вам не нужно быть таким агрессивным, я не пытался напасть на вас. Кроме того, мне нужно научиться регулярному выражению. –