OK,有很多事情去努力。讓我們從你如何解析HTML開始。如果你正在做的是分析一個片段或一個標籤,你可以使用的DocumentFragment告訴引入nokogiri不添加常用的HTML標籤:
require 'nokogiri'
doc = Nokogiri::HTML('<img class="img-responsive" src="img/logologo.png" alt="">')
doc.to_html # => "<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\" \"http://www.w3.org/TR/REC-html40/loose.dtd\">\n<html><body><img class=\"img-responsive\" src=\"img/logologo.png\" alt=\"\"></body></html>\n"
相反,你可以這樣做:
doc = Nokogiri::HTML::DocumentFragment.parse('<img class="img-responsive" src="img/logologo.png" alt="">')
doc.to_html # => "<img class=\"img-responsive\" src=\"img/logologo.png\" alt=\"\">"
下一頁,當您的意思是at
,at_css
或at_xpath
時,請勿使用css
,xpath
或search
。默想這一點:
doc.css('img').class # => Nokogiri::XML::NodeSet
doc.at('img').class # => Nokogiri::XML::Element
doc.css('img')[0].to_html # => "<img class=\"img-responsive\" src=\"img/logologo.png\" alt=\"\">"
doc.css('img').first.to_html # => "<img class=\"img-responsive\" src=\"img/logologo.png\" alt=\"\">"
doc.at('img').to_html # => "<img class=\"img-responsive\" src=\"img/logologo.png\" alt=\"\">"
這css
,xpath
和search
返回一個節點集是顯著有所爲記。 at
及其變體相當於在返回的NodeSet上使用first
或[0]
,返回第一個節點,因此使用at
和朋友,如果這就是您的意思,因爲它會導致代碼不那麼嘈雜。
這是我怎麼會去一下吧:
require 'nokogiri'
doc = Nokogiri::HTML::DocumentFragment.parse('<img class="img-responsive" src="img/logologo.png" alt="">')
img = doc.at('img')
img_src = img.delete('src')
img_params = img.map { |p, v| ":%s => '%s'" % [p, v] }.join(', ')
# => ":class => 'img-responsive', :alt => ''"
img_template = "<%%= image_tag('%s', %s) %%>" % [img_src, img_params]
# => "<%= image_tag('img/logologo.png', :class => 'img-responsive', :alt => '') %>"
當然,使用關鍵:k => "v"
格式/值是老派的。我建議改爲:
img_params = img.map { |p, v| "%s: '%s'" % [p, v] }.join(', ') # => "class: 'img-responsive', alt: ''"
導致:
"<%= image_tag('img/logologo.png', class: 'img-responsive', alt: '') %>"
爲什麼你要一個靜態的'img' HTML標記翻譯成'image_tag'與會有限制屬性?你想達到什麼目的? – spickermann
當我開發'erb'頁面時,由於rails資產管道,我需要轉換''。我的前端合作伙伴只知道如何編寫'html'而不是'erb'。 –