2014-12-23 4 views
2

Я хочу бросить переменную Ruby, заполненную HTML-файлом, который я захватил с открытым uri и nokogiri, в системный процесс backticks, чтобы привести его в порядок. Характер переменной путает процесс. Я думаю, мне нужно сбежать, но я не уверен. Любые советы приветствуются.Ruby Escaping Arguments Inside Backticks Shell

require 'open-uri' 
require 'nokogiri' 

url = 'http://www.wikihow.com/Bathe-a-Cat' 
page = Nokogiri::HTML(open(url)) 
pagestring = page.to_s 

result = `tidy --break-before-br no --char-encoding utf8 --clean yes --drop-empty-paras yes ' #{pagestring}'` 
puts results.length 

Здесь ошибка я получаю:

sh: -c: line 144: syntax error near unexpected token `"Search","Search","Custom_search"' 
sh: -c: line 144: ` <input type="submit" id="cse_sa" value="Search" class="search_button" onmouseover="button_swap(this);" onmouseout="button_unswap(this);" onclick='gatTrack("Search","Search","Custom_search");'>' 

Приветствия

ответ

0

Вы можете использовать IO.popen вместо. После этого вы можете вызвать команду с массивом вместо stringifying его:

cmd = %w{ tidy --break-before-br no --char-encoding utf8 --clean yes --drop-empty-paras yes } 
result = IO.popen(cmd, 'r+') {|io| 
    io.puts pagestring 
    io.close_write 
    io.read 
} 

предполагая tidy читает HTML из стандартного ввода.

+0

Отлично. Работал как шарм. Я никогда не использовал это раньше, и я полагал, что обратные решения будут решением. Я новичок в Ruby. Спасибо за ваш вклад, ребята! –

1

Вместо того, чтобы сбрасывать все, что HTML в командную строку, то почему бы не сделать файл?

require 'open-uri' 
require 'nokogiri' 
require 'tempfile' 

url = 'http://www.wikihow.com/Bathe-a-Cat' 
page = Nokogiri::HTML(open(url)) 
pagestring = page.to_s 

file = Tempfile.new('blah') 
file.write(pagestring) 
file.close 

result = `tidy --break-before-br no --char-encoding utf8 --clean yes --drop-empty-paras yes #{file.path}` 
puts result.length 

file.unlink 

Кажется работать с быстрой проверки здесь ...

+0

Потому что я не хочу, чтобы файлы были сделаны. Это крючок, который я пишу, чтобы получить «текущий URL Safari» в BBEdit без каких-либо файлов. Процесс называется вручную, и мне нужен нулевой размер. На пути к BBEdit я подумал, что я очищу HTML для просмотра, что является общей целью сделать все это. –

+0

Извините ... Я изначально думал, что мне, возможно, придется сделать файл, но просто бросать данные вокруг - это просто отлично, если не предпочтительнее. –

0

Для обычных аргументов, таких как пути к файлам и тому подобное, вы можете использовать "str".shellescape (http://apidock.com/ruby/Shellwords/shellescape).

args_array = [ ... ] 
`tidy #{args_array.map(&:shellescape).join(' ')` 

Однако, чтобы пройти полный HTML-файл в качестве аргумента командной строки, что-то вроде того, что было предложено выше может быть лучше. Я просто хотел бы упомянуть об этом здесь для ссылки на других для обычных аргументов cli.