Nokogiri将href属性返回为零

时间:2016-12-14 17:07:20

标签: ruby-on-rails ruby nokogiri

我正在使用我的config / routes.rb中定义的两个端点(至少现在)构建一个小API:

Rails.application.routes.draw do

  get '/api/list',      to: 'api#list'
  get '/api/add/:url',  to: 'api#add'

end

其中一个端点收到一个URL,我用app / controllers / api_controller.rb中的以下代码解析并存储了一些内容:

require 'nokogiri'
require 'httparty'

class ApiController < ApplicationController

  def list
  end

  def add
    @url = "http://#{params[:url]}"
    site = Site.create(url: @url)
    site.save!
    page = HTTParty.get(@url)
    doc = Nokogiri::HTML(page)
    ['h1','h2','h3','a'].each do |tag|
      doc.xpath("//#{tag}").each do |cont|
        if (tag == 'a') then
          content = Content.create({site_id: site.id, text: cont.at_xpath('/a/@href').to_s.strip!, content_type: 'href', content_tag: tag })
        else 
          content = Content.create({site_id: site.id, text: cont.text().to_s.strip!, content_type: 'tag_content', content_tag: tag })
        end
        content.save!
      end
    end
  end

end

我设法完美地获取了<h1><h2><h3>标记的内容,但href标记的<a>属性的内容正在保存为nil,我真的不知道这有什么问题:

cont.at_xpath('/a/@href').to_s.strip!

表达。

我已经尝试过:

cont.at_xpath('/@href').to_s.strip!

因为在这种情况下cont已经是a节点,但它发生的情况相同。

我正在使用Rails 5,我用--api启动了我的项目。

任何提示?

1 个答案:

答案 0 :(得分:2)

首先获取锚标记,然后传递href属性。

您已使用此代码获取锚标记:

['h1','h2','h3','a'].each do |tag|
  doc.xpath("//#{tag}").each do |cont|
  end
end

现在,您只使用包含锚标记的cont来使用cont['href']获取其href:

content = Content.create({site_id: site.id, text: cont['href'], content_type: 'href', content_tag: tag })