我正在使用我的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
启动了我的项目。
任何提示?
答案 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 })