我想从这个网页中提取搜索表单,并将其呈现在我的Rails应用程序的"static_pages/home"页面上:Codepen"static_paies/home"示例
采取的步骤:
-
我创建了以下Ruby脚本来验证我是否真的可以提取表单:
require 'nokogiri' require 'open-uri' url = 'http://websoc.reg.uci.edu/perl/WebSoc' data = Nokogiri::HTML(open(url)) form = data.xpath('//form[@action="http://websoc.reg.uci.edu/perl/WebSoc"]') puts form
-
转移到Rails,我在gem文件中包含了Nokogiri和OpenURI,并使用bundle安装了gem。
-
我创建了一个StaticPages控制器:
class StaticPagesController < ApplicationController def home require 'nokogiri' require 'open-uri' url = 'http://websoc.reg.uci.edu/perl/WebSoc' data = Nokogiri::HTML(open(url)) @form = data.xpath('//form[@action="http://websoc.reg.uci.edu/perl/WebSoc"]') end end
-
以及附带的视图:
<h1>StaticPages#home</h1> <p>Find me in app/views/static_pages/home.html.erb</p> <%= @form %>
HTML代码被成功提取,但它被呈现为文本而不是HTML。看起来要么:
@form = data.xpath('//form[@action="http://websoc.reg.uci.edu/perl/WebSoc"]')
或
<%= @form %>
将提取的HTML转换为文本。如何将提取的HTML内容作为HTML而非文本插入?
我的研究建议使用Net:HTTP。
只需在视图中放置<%= @form.html_safe %>
,就会返回一个错误。这是因为@form
的格式是文本,而不是HTML。纠正此问题:
-
转到静态页面控制器并更改:
@form = data.xpath('//form[@action="http://websoc.reg.uci.edu/perl/WebSoc"]')
至@form=data.xpath('//form[@action="http://websoc.reg.uci.edu/perl/WebSoc"]').to_html.
-
现在
@form
将HTML存储为HTML,而不是文本。为了在视图中呈现这一点,我们需要更改:<%= @form %>
至
<%= @form.html_safe %>
默认情况下,Rails会将<%= @form %>
转换为文本,作为安全预防措施;您不希望在页面中嵌入恶意代码。通过声明@form.html_safe
,我们告诉Rails HTML内容是有意的,因此是安全的。这允许@form
的内容在视图中呈现为HTML。
您的问题指出,您在Nokogiri::XML::NodeSet
时收到文本。
"如何使用Nokogiri在两个HTML注释之间抓取HTML?"是一个类似于废弃节点的问题。一旦得到字符串html_string
,就可以使用html_string.html_safe
。