2012-12-02 4 views
0

Product 모델에서 다음 코드를 사용하여 og:image 개의 소매 사이트를 읽고 저장합니다.형식이 잘못된 오픈 그래프 URL을 읽는 방법

def photo_from_url(url) 
    if !Nokogiri::HTML(open(url)).css("meta[property='og:image']").blank? 
    photo_url = Nokogiri::HTML(open(url)).css("meta[property='og:image']").first.attributes["content"] 
    self.photo = URI.parse(photo_url) 
    self.save 
    end 
end 

이 대부분의 페이지에서 작동하지만, bad URI(is not URI?) 이러한 링크의 예를 반환 일부 og:image의가 H & M의 소매 사이트에 다음 링크 형식입니다.

http://lp.hm.com/hmprod?set=source[/model/2012/K71 05701 95313 06 0043 0.jpg],rotate[],width[],height[],x[],y[],type[STILL_LIFE_FRONT]&call=url[file:/product/facebook] 

분명히, 이것은 꽤 연결되지 않습니다 (심지어 StackOverflow의의 마크 다운 파서는 ... 링크하다고 말할 수 없다)하지만, 브라우저에 직접 붙여 넣을 때 실제로 작동 않습니다.

이렇게 링크를 올바르게 읽으려면 어떻게해야합니까?

+0

_ _ "내가 제대로이 같은 링크를 읽기 위해 할 수있는 일?"- 내부에 허용되지 않는 문자에 적절한 URL 인코딩을 적용 URL ...? – CBroe

답변

2

와우, 그것은 불쾌한 URL처럼 보입니다. 에도 불구하고 멋진 URL 방식, 난 당신이 단순히 URI::Escape를 사용하여 URL을 탈출 제안 :

irb(main):001:0> url = "http://lp.hm.com/hmprod?set=source[/model/2012/K71 05701 95313 06 0043 0.jpg],rotate[],width[],height[],x[],y[],type[STILL_LIFE_FRONT]&call=url[file:/product/facebook]" 
=> "http://lp.hm.com/hmprod?set=source[/model/2012/K71 05701 95313 06 0043 0.jpg],rotate[],width[],height[],x[],y[],type[STILL_LIFE_FRONT]&call=url[file:/product/facebook]" 
irb(main):002:0> uri = URI.escape url 
=> "http://lp.hm.com/hmprod?set=source[/model/2012/K71%2005701%2095313%2006%200043%200.jpg],rotate[],width[],height[],x[],y[],type[STILL_LIFE_FRONT]&call=url[file:/product/facebook]" 
irb(main):003:0> URI(uri) 
=> #<URI::HTTP:0x000000024321d0 URL:http://lp.hm.com/hmprod?set=source[/model/2012/K71%2005701%2095313%2006%200043%200.jpg],rotate[],width[],height[],x[],y[],type[STILL_LIFE_FRONT]&call=url[file:/product/facebook]> 
+0

감사합니다. @jonallard. 이것은 내가해야 할 일은'photo_uri = URI.escape (photo_url)'에서처럼 og : image에 대한 url을 탈출하는 것입니까? 이 결과는 # 에 대해'정의되지 않은 메소드 'gsub'가됩니다. 나는 무엇을 잘못하고있을 것인가? 그런 멍청한 질문을 처리해 주셔서 감사합니다! – umezo

+2

그 모습에서 String (URI)이 아닌'escape' 메쏘드에서 Nokogiri :: XML :: Attr을 제공하게 될 것입니다. 나는 당신이 그 방법으로 통과하고있는 것을 정확히 확인할 것입니다. –

+0

그게 정확히 문제였습니다. 난 그냥 이스케이프 메서드 (즉, Nokogiri에서 얻은 출력)에 전달하는 것에'.to_s '를 추가했으며, 매력처럼 작동합니다. 도와 주셔서 감사합니다! – umezo