#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 — это онлайн-справочник, поэтому вопросы должны содержать информацию в центре внимания, а именно текст вопроса, а также всю необходимую информацию, чтобы все были в выигрыше.