从web读取文本文件并分配给Ruby / Chef中的变量

时间:2015-12-24 22:03:14

标签: ruby chef

我想从网上阅读一个文本文件并将其分配给chef / ruby​​中的变量

在powershell中我会做这样的事情:

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

有谁能告诉我这是如何在红宝石中完成的?

3 个答案:

答案 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 。这可能就是你所需要的,但除非你真正处理纯文本,否则这种方法通常没有进一步处理就没用。

使用Nokogiri解析HTML

通常,打开一个不提供应用程序/ json或text / plain MIME内容类型的URI会为您提供一个不是很有用的大字符串。在这种情况下,请使用Nokogiri gem对输出执行某些操作。

示例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 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类型可能要求您使用更简约的方法。