2016-12-14 6 views
1

나는에 의해 내 설정/routes.rb에 정의 된 (적어도 지금 쯤) 두 엔드 포인트와 작은 API를 건물입니다 : 엔드 포인트노코 기리 반환 href 속성이 전무

Rails.application.routes.draw do 

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

end 

한 것은 URL을 수신하고 나는 구문 분석하고 응용 프로그램/컨트롤러/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 attribut의 내용 <a> 태그 ES는 nil로 저장되고 난 정말이 뭐가 잘못된 건지 모르겠다 :

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

표현. cont 이후

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

이미이 경우 a 노드이지만, 같은 일이 :

은 이미했습니다.

저는 레일 5를 사용하고 있습니다. --api으로 프로젝트를 시작했습니다.

힌트가 있습니까?

답변

2

먼저 앵커 태그를 가져온 다음 href 속성을 전달하십시오.

는이 코드를 이미 앵커 태그를 얻을 :

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

지금 만 cont['href']를 사용하여 HREF를 얻기 위해 앵커 태그가 포함 cont를 사용

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

이 작동하지 계속합니다. 여전히 href 속성의 값으로'nil'을 얻습니다. –

+0

죄송합니다. 내 대답을 업데이트했습니다. –

+0

예, 이제 작동합니다. 나는이 "해시 같은"방식으로 노드의 속성을 언급하는 것이 가능하다는 것을 몰랐다. 당신의 도움을 주셔서 감사합니다! –