Форум программистов, компьютерный форум, киберфорум
Наши страницы
Ruby
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.50/8: Рейтинг темы: голосов - 8, средняя оценка - 4.50
Belzik
0 / 0 / 0
Регистрация: 15.04.2016
Сообщений: 10
1

Обучающее задания для Ruby

15.04.2016, 10:55. Просмотров 1609. Ответов 12
Метки нет (Все метки)

Добрый день. В Ruby я новичок, Есть такое задание: ввести адрес сайта, она должна скачать html этого сайта, скачать все картинки и положить в папку. Не могли бы вы подсказать какими методами и приемами это можно реализовать?
0
Лучшие ответы (1)
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.04.2016, 10:55
Ответы с готовыми решениями:

чтобы выучить Ruby on Rails, надо перед этим учить сам Ruby?
чтобы учить Ruby on Rails, надо перед этим учить сам Ruby?

Литература по Ruby и Ruby-on-Rails
Здравствуйте! Посоветуйте хороший самоучитель по Ruby для начинающих программистов! Спасибо!

Чтобы писать на Ruby on Rails - нужно учить Ruby потом Rails?
Чтобы выучить Ruby on Rails - нужно учить Ruby потом Rails?

Для чего нужен Ruby?
Привет народ, вопрос такой - для каких задач хорошо подходит руби, кроме web-разработки со стороны...

FFT код для ruby?
Прошу помочь если кто-то решал данный вопрос.

12
Nameless One
Эксперт С++
5796 / 3445 / 356
Регистрация: 08.02.2010
Сообщений: 7,448
15.04.2016, 13:15 2
Скачивание html и картинок делаешь с помощью OpenURI. Чтобы получить адреса картинок, парсишь HTML с помощью Nokogiri либо с помощью регулярных выражений (disclaimer).
1
Belzik
0 / 0 / 0
Регистрация: 15.04.2016
Сообщений: 10
15.04.2016, 14:17  [ТС] 3
Ruby
1
2
3
4
5
6
7
8
require 'nokogiri'
require 'open-uri'
 
url = 'http://www.cubecinema.com/programme'
html = open(url)
doc = Nokogiri::HTML(html)
 
File.open('note.txt', 'w'){ |f| f.write(doc) }
Так, ну html файл я получил, а потом по каким принципам искать адреса картинок? Или возможно я Вас неправильно понял и их нужно искать как-то до парсинга или во время, если честно не очень понимаю. Есть ли какая-нибудь хорошая статья на РУ (англ учу, но на данный момент он у меня хреновый) по тому, как искать на руби нужный контент?
0
Nameless One
Эксперт С++
5796 / 3445 / 356
Регистрация: 08.02.2010
Сообщений: 7,448
15.04.2016, 14:39 4
Вообще, для парсинга HTML я бы порекомендовал использовать Nokogiri::HTML вместо Nokogiri::XML

Цитата Сообщение от Belzik Посмотреть сообщение
Или возможно я Вас неправильно понял и их нужно искать как-то до парсинга или во время
После. Метод Nokogiri::XML (или Nokogiri::HML) парсит XML (или HTML, соответственно) и возвращает объект (doc в твоём примере), который представляет собой дерево узлов документа. В этом дереве можно искать отдельный узлы с помощью методов #css (поиск с помощью CSS-селекторов) и #xpath (поиск с помощью XPath-селекторов). Методы возвращают список найденных узлов. Из узла уже можно вытащить атрибут src.

Цитата Сообщение от Belzik Посмотреть сообщение
Есть ли какая-нибудь хорошая статья на РУ по тому, как искать на руби нужный контент?
Попробуй погуглить, на английском точно есть.

Примерный вариант будет выглядить так (написано из головы):

Ruby
1
2
3
4
5
6
7
# ...
doc = Nokogiri::HTML(html)
 
doc.css('img').each do |img|
   # печатаем адрес изображения
   puts img[:src]
end
1
15.04.2016, 14:39
Belzik
0 / 0 / 0
Регистрация: 15.04.2016
Сообщений: 10
15.04.2016, 14:52  [ТС] 5
Спасибо, на английском то нашел, но мой английский оставляет желать лучшего.... Ладно пошел с гуглом переводчиком читать. Спасибо за ответы.

Добавлено через 12 минут
Ваш пример работает, если дописать "do" вначале.


Ruby
1
2
3
4
doc = Nokogiri::HTML(html)
doc.css('img').each do |img|
  puts img[:src]
end
А возможно потом скачать эти картинки через ruby в папку?
0
Nameless One
Эксперт С++
5796 / 3445 / 356
Регистрация: 08.02.2010
Сообщений: 7,448
15.04.2016, 14:53 6
Цитата Сообщение от Belzik Посмотреть сообщение
Ваш пример работает, если дописать "do" вначале
Да я уже сам успел пример отредактировать.

Цитата Сообщение от Belzik Посмотреть сообщение
А возможно потом скачать эти картинки через ruby в папку?
А почему бы и нет? Адреса картинок ты получил, open у тебя есть, нужно только URL нормализовать с помощью метода #merge, и всё.
1
Belzik
0 / 0 / 0
Регистрация: 15.04.2016
Сообщений: 10
15.04.2016, 14:56  [ТС] 7
А с помощью чего это делается? Нужен ли какой-то отдельный гем?
0
Nameless One
Эксперт С++
5796 / 3445 / 356
Регистрация: 08.02.2010
Сообщений: 7,448
15.04.2016, 14:57 8
Цитата Сообщение от Belzik Посмотреть сообщение
А с помощью чего это делается?
Что делается? Скачивание? Скачивание делается точно так же, как ты в своём примере делал сохранение html в файл.
0
Belzik
0 / 0 / 0
Регистрация: 15.04.2016
Сообщений: 10
15.04.2016, 15:38  [ТС] 9
Так, ну, что я сделал. С merge если честно не очень понял. Поэтому сделал так (можно ли так???):
Ruby
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
require 'nokogiri'
require 'open-uri'
 
url = "http://www.cubecinema.com/programme"
html = open(url)
doc = Nokogiri::HTML(html)
 
File.open('exemplar.html', 'w'){ |f| f.write(doc) }
 
imgs = []
 
doc.css('img').each do |img|
  imgs.push("http://www.cubecinema.com" + img[:src])
  puts img[:src]
end
puts "-------------------------------------------------------------------------------------------"
puts imgs
В итоге в массиве лежат все по идеи нормальные ulr, которые открывают картинку в браузере (проверял, тыкал ) Но как имея URL картинки сохранить картинку в папку всеравно не могу допереть.....
0
Nameless One
Эксперт С++
5796 / 3445 / 356
Регистрация: 08.02.2010
Сообщений: 7,448
15.04.2016, 15:43 10
Цитата Сообщение от Belzik Посмотреть сообщение
Но как имея URL картинки сохранить картинку в папку всеравно не могу допереть.....
Лол, у тебя в восьмой строке идёт сохранение HTML в текущую папку. Сохранение изображений принципиально ничем не отличается (разве что файл для записи можно открыть в двоичном режиме).

Ruby
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
require 'nokogiri'
require 'open-uri'
require 'uri'
require 'pathname'
 
url = 'http://www.cubecinema.com/programme'
base = URI.parse(url)
 
html = open(url)
doc = Nokogiri::HTML(html)
 
doc.css('img').each do |img|
  src = img[:src]
  normalized = base.merge(URI.parse(src)).to_s
  filename = Pathname.new(normalized).basename
 
  open(normalized) do |img_file|
    File::open(filename, 'wb') do |f|
      f.write(img_file.read)
    end
  end
end
2
Belzik
0 / 0 / 0
Регистрация: 15.04.2016
Сообщений: 10
15.04.2016, 15:50  [ТС] 11
Если честно, не очень понимаю, что происходит в коде.....
0
Nameless One
Эксперт С++
5796 / 3445 / 356
Регистрация: 08.02.2010
Сообщений: 7,448
15.04.2016, 15:51 12
Лучший ответ Сообщение было отмечено Belzik как решение

Решение

http://ruby-doc.org/
1
Belzik
0 / 0 / 0
Регистрация: 15.04.2016
Сообщений: 10
15.04.2016, 16:17  [ТС] 13
Сенк, более менее разобрался.
0
15.04.2016, 16:17
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.04.2016, 16:17

Вернуть из С++ функции массив для Ruby
Вот рабочий пример как передать массив в С++ из руби: require 'inline' # Ruby Inline 3.12 c...

RSpec тест для Ruby кода
Добрый день. Помогите написать спек тест для кода Ruby: class B def initialize end ...

Ruby \ Простая задача для новичка
Доброе время суток, форумчане! Помогите пожалуйста с реализацией следующей задачи на языке...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru