Я хочу прочитать текстовый файл из Интернета и назначить его переменной в chef / ruby

В PowerShell я бы сделал что-то вроде этого:

$content = (Invoke-WebRequest http://website.com/string.txt).content

Кто-нибудь может сказать мне, как это делается в рубине?

1
Johnny Grimes 25 Дек 2015 в 01:03

3 ответа

Лучший ответ

В Chef правильный подход - использовать клиент Chef::HTTP.

Chef::HTTP.new('https://example.com/').get('/string.txt')
2
coderanger 24 Дек 2015 в 23:33

Минимальный пример

Если ваш URL-адрес действительно представляет собой простой текстовый файл, вы можете использовать OpenURI из стандартной библиотеки Ruby. В вашем примере вы указываете на «string.txt», но мы будем использовать реальную веб-страницу только для демонстрационных целей.

require 'open-uri'
content = open('http://google.com').read

В результате все содержимое URL будет присвоено переменной content . Это может быть все, что вам нужно, но если вы действительно не имеете дело с простым текстом, этот подход обычно бесполезен без дальнейшей обработки.

Используйте Nokogiri для синтаксического анализа HTML

В общем, открытие URI, который не предоставляет тип содержимого MIME application / json или text / plain, дает вам большую строку, которая не так уж и полезна. В таких случаях используйте гем Nokogiri, чтобы что-то сделать с выводом.

Пример 1: Извлечение элементов формы

Например, чтобы извлечь элементы формы с веб-страницы Google:

require 'open-uri'
require 'nokogiri'

uri = 'http://google.com'
doc =  Nokogiri::HTML(open uri)
doc.css('title, form input').each { |e| puts e }

Это отфильтрует страницу и напечатает только нужные элементы. В этом случае результатом будет:

<title>Google</title>
<input name="ie" value="ISO-8859-1" type="hidden">
<input value="en" name="hl" type="hidden">
<input name="source" type="hidden" value="hp">
<input name="biw" type="hidden">
<input name="bih" type="hidden">
<input style="color:#000;margin:0;padding:5px 8px 0 6px;vertical-align:top" autocomplete="off" class="lst" value="" title="Google Search" maxlength="2048" name="q" size="57">
<input class="lsb" value="Google Search" name="btnG" type="submit">
<input class="lsb" value="I'm Feeling Lucky" name="btnI" onclick="if(this.form.q.value)this.checked=1; else top.location='/doodles/'" type="submit">
<input id="gbv" name="gbv" type="hidden" value="1">

Пример 2: Извлечение простого текста из элементов абзаца

В качестве другого примера рассмотрим этот фрагмент. Он извлекает содержимое первых двух тегов абзаца из записи Ruby Wikipedia.

require 'open-uri'
require 'nokogiri'

puts Nokogiri::HTML(open uri).css(?p).map { |e| e.text }.slice(0,2).join "\n\n"

Нарезая и объединяя массив элементов абзаца или элементы массива, вы можете очень легко извлекать текстовые данные. Использование выражений Nokogiri XPath даст вам еще больше возможностей. В этом случае результат:

Ruby - это динамический, рефлексивный, объектно-ориентированный язык программирования общего назначения. Он был разработан и разработан в середине 1990-х Юкихиро «Мац» Мацумото в Японии.

По словам его создателя, Ruby находился под влиянием Perl, Smalltalk, Eiffel, Ada и Lisp. [12] Он поддерживает несколько парадигм программирования, включая функциональное, объектно-ориентированное и императивное. Он также имеет систему динамического типа и автоматическое управление памятью.

С Nokogiri вы, безусловно, можете сделать намного больше, но это должно помочь вам начать работу. Суть в том, что синтаксический анализ HTML обычно лучше, чем использование регулярных выражений в ответе text / html, но, конечно, есть случаи, когда тип MIME вашего ответа может указывать на использование более минималистичный подход.

1
Community 20 Июн 2020 в 09:12

Используйте OpenURI Ruby.

require 'open-uri'
content = open("http://website.com/string.txt").read
1
user513951 24 Дек 2015 в 22:04