【问题标题】:Why does my extracted/scraped HTML code render as text?为什么我提取/抓取的 HTML 代码呈现为文本?
【发布时间】:2014-11-02 01:02:43
【问题描述】:

我想从this webpage 中提取搜索表单,并将其呈现在我的Rails 应用程序的“static_pages/home”页面上:Codepen Example of "static_pages/home"

采取的步骤:

  1. 我创建了以下 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 
    
  2. 转移到 Rails,我将 Nokogiri 和 OpenURI 包含在我的 gem 文件中,并使用 bundle 来安装 gem。

  3. 我创建了一个 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
    
  4. 以及随附的视图:

    <h1>StaticPages#home</h1>
    <p>Find me in app/views/static_pages/home.html.erb</p>
    <%= @form %>
    

HTML 代码已成功提取,但呈现的是 as text 而不是 HTML。看起来像:

@form = data.xpath('//form[@action="http://websoc.reg.uci.edu/perl/WebSoc"]')

或

<%= @form %>

将提取的 HTML 转换为文本。如何插入已提取为 HTML 而不是文本的 HTML 内容?

我的研究建议使用Net:HTTP。

【问题讨论】:

  • 不会是因为Rails自动转义&lt;%= @form %&gt;中的html代码吧?使用&lt;%= @form.html_safe %&gt; 怎么样? (对不起,我不知道在你的 Rails 版本中写它的正确方法)

标签: html ruby-on-rails ruby nokogiri screen-scraping


【解决方案1】:

只需在视图中输入&lt;%= @form.html_safe %&gt;,就会返回错误。这是因为 @form 被格式化为文本,而不是 HTML。 要更正此问题:

  1. 转到静态页面控制器并更改:

    @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.

  2. 现在@form 将 HTML 存储为 HTML,而不是文本。要在视图中渲染它,我们需要更改:

    <%= @form %>
    

    到

    <%= @form.html_safe %>
    

默认情况下,Rails 会将&lt;%= @form %&gt; 转换为文本作为安全预防措施;您不希望将恶意代码嵌入到您的页面中。通过声明@form.html_safe,我们告诉Rails HTML 内容是有意的,因此是安全的。这允许@form 的内容在视图中呈现为 HTML。

【讨论】:

    【解决方案2】:

    您的问题表明您收到的是Nokogiri::XML::NodeSet 的文本。

    "How do I scrape HTML between two HTML comments using Nokogiri?" 是用于报废节点的类似问题。一旦你得到字符串html_string,你就可以使用html_string.html_safe。

    【讨论】:

    • 它返回一个错误:"undefined method `html_safe' for #<:xml::nodeset:0x4079d30>"
    猜你喜欢
    • 1970-01-01
    • 2015-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多