Как очистить Ruby, когда элементы страницы продолжают меняться и смещаться.

#html #css #ruby #web-scraping #elements

#HTML #css #ruby #очистка веб-страниц #элементы

Вопрос:

Я пишу программу для загрузки изображений из альбома imgur: я только начал писать фактический код ссылки на изображение:

 #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(amp;quot;//i.imgur.com/zh6I7k2b.jpgamp;quot;);"></span>

И все же, когда я смотрю в исходный код страницы или запускаю код для элементов 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 был бы первым, что нужно исследовать. «inspect» и «view-source» отражают страницу после того, как браузер обработал в ней JavaScript и CSS, что часто мало влияет на то, как выглядела фактическая страница до этого. Поиск SO для [ruby] [watir] .

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

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

Не используйте глобальный like $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
  

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

 require 'uri'

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

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

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

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

Комментарии:

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

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

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

4. Никто не ведет себя агрессивно. Я пытаюсь убедиться, что заданный вопрос соответствует рекомендациям и помогает другим, кто ищет решение, а не просто отвечает на ваш вопрос. SO — это онлайн-справочник, поэтому вопросы должны содержать информацию в центре внимания, а именно текст вопроса, а также всю необходимую информацию, чтобы все были в выигрыше.