我想从网上阅读一个文本文件并将其分配给chef / ruby中的变量
在powershell中我会做这样的事情:
$content = (Invoke-WebRequest http://website.com/string.txt).content
有谁能告诉我这是如何在红宝石中完成的?
答案 0 :(得分:2)
在Chef内,正确的方法是使用Chef::HTTP
客户端。
Chef::HTTP.new('https://example.com/').get('/string.txt')
答案 1 :(得分:1)
使用Ruby的OpenURI library。
require 'open-uri'
content = open("http://website.com/string.txt").read
答案 2 :(得分:1)
如果您的URL实际上只是纯文本文件,则可以使用Ruby标准库中的OpenURI。在您的示例中,您指向" string.txt",但我们仅使用真实网页进行演示。
require 'open-uri'
content = open('http://google.com').read
这会将URL的所有内容分配给变量 content 。这可能就是你所需要的,但除非你真正处理纯文本,否则这种方法通常没有进一步处理就没用。
通常,打开一个不提供应用程序/ json或text / plain MIME内容类型的URI会为您提供一个不是很有用的大字符串。在这种情况下,请使用Nokogiri gem对输出执行某些操作。
例如,要从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">
作为另一个例子,请考虑这个片段。它从Ruby Wikipedia entry中提取前两个段落标记的内容。
require 'open-uri'
require 'nokogiri'
puts Nokogiri::HTML(open uri).css(?p).map { |e| e.text }.slice(0,2).join "\n\n"
通过切片和连接段落元素数组或grepping数组元素,您可以非常轻松地提取文本数据。使用Nokogiri XPath表达式可以为您提供更多功能。在这种情况下,结果是:
Ruby是一种动态的,反思的,面向对象的通用编程语言。它是由Yukihiro&#34; Matz&#34;在20世纪90年代中期设计和开发的。松本在日本。
根据它的创建者,Ruby受Perl,Smalltalk,Eiffel,Ada和Lisp的影响。[12]它支持多种编程范例,包括功能,面向对象和命令式。它还具有动态类型系统和自动内存管理。
你可以用Nokogiri做更多的事情,但这应该让你开始。真正的一点是,解析 HTML通常比在text / html响应中使用正则表达式更好,但当然有一些情况下,您的响应的MIME类型可能要求您使用更简约的方法。