如何在HTML页面中提取搜索元名称以使用Nokogiri提取内容

时间:2014-07-05 17:38:07

标签: ruby-on-rails ruby nokogiri asp.net-web-api httparty

我正在尝试使用Nokogiri和HTTparty来获取我在rails模型中生成的内容验证令牌。此元标记具有UUID,用户会将该标记粘贴到其index.html文件中以进行验证:

域名模型:

class Domain
  include Mongoid::Document

  field :name, type: String
  field :url, type: String
  field :active, type: Boolean, default: false
  field :verification_token, type: String

  belongs_to :user

  before_create :generate_verification_token

  protected

  def generate_verification_token
    self.verification_token = SecureRandom.hex(30)
  end
end

域视图:

<h1><%= @domain.name %></h1>

<p><%= @domain.url %></p>

<% if !@domain.active? %>
<div class="alert alert-danger">
  <strong>Oops!</strong> Your domain is not verified!.
</div>
<div class="lead">
  Please add the following meta tag to your domain root url page
  <pre><%= "<meta name='trackmetrics_verification' content='#{@domain.verification_token}'/>" %></pre>
</div>
<% end %>
<%= link_to "Edit", edit_domain_path(@domain), class: 'btn btn-success' %>
<%= link_to "New Domain", new_domain_path(@domain), class: 'btn btn-success' %>
<p><%= link_to "Back to List", domains_path %></p>

基本上,用户将包括

<meta name='trackmetrics_verification' content='21bd47859ea549244e66a4582e99068fe0bc2063d6276a4426c2c3bb2e15'/>

在他们的根网址页面(index.html)中我希望有一个Verification Controller来检查用户是否在该页面中实际包含了元标记..如果他们这样做,他们的域名将被标记为True。

我的验证控制器:

class VerificationController < ApplicationController

  require 'nokogiri'
  require 'httparty'

  def index
    @domain = Domain.find(params[:Domain_id]) 
    @doc = Nokogiri::HTML(HTTParty.get(@domain.url))
  end

end

我的问题是如何抓住

<meta name='trackmetrics_verification' content='21bd47859ea549244e66a4582e99068fe0bc2063d6276a4426c2c3bb2e15'/>

使用Nokogiri寻找trackmetrics_verification metaname?

会不会像

def index
        @domain = Domain.find(params[:Domain_id]) 
        @doc = Nokogiri::HTML(HTTParty.get(@domain.url))
        if @doc.xpath("//meta[@name ="trackmetrics_verification"]")
           @domain.active = true
           flash[:notice] = "Your domain has been verified!"
       else
           flash[:error] = "Incorrect verification"
       end
end

1 个答案:

答案 0 :(得分:3)

您使用的XPath //meta[@name ="trackmetrics_verification"]将返回meta属性name的所有trackmetrics_verification个元素节点(可能只有一个此类节点) )。您需要此节点的content属性。获得它的一种方法是扩展查询以指定属性:

//meta[@name ="trackmetrics_verification"]/@content

使用Nokogiri,使用at_xpath,因为您只需要一个匹配的节点,您可以使用text方法获取属性节点的值:

@doc.at_xpath('//meta[@name ="trackmetrics_verification"]/@content').text

Nokogiri的另一种选择是选择meta节点并使用[] method获取属性的值:

@doc.at_xpath('//meta[@name ="trackmetrics_verification"])['content']