【问题标题】:How to read poorly formatted Open Graph urls如何读取格式不佳的 Open Graph url
【发布时间】:2012-12-02 23:21:11
【问题描述】:

我目前在我的Product 模型中使用以下代码来读取和保存零售站点的og:images。

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

虽然这适用于大多数页面,但有一些 og:images 返回 bad URI(is not URI?) 此类链接的一个示例是 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 的 Markdown 解析器也无法判断它是一个链接......),但当直接粘贴到浏览器中时它确实有效。

如何正确阅读这样的链接?

【问题讨论】:

  • “我该怎么做才能正确读取这样的链接?” – 对 URL 中不允许的字符应用正确的 URL 编码......?

标签: ruby-on-rails facebook-opengraph


【解决方案1】:

哇,这看起来像一个讨厌的 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]>

【讨论】:

  • 谢谢@jonallard。这是否意味着我需要做的就是转义 og:image 的 url,如photo_uri = URI.escape(photo_url)?这会导致 #<:xml::attr:0x007fe59cb296a0> 的 undefined method gsub'。我可能做错了什么?感谢您处理这样一个菜鸟问题!
  • 从外观上看,您将在 escape 方法中提供 Nokogiri::XML::Attr 而不是字符串 (URI)。我会检查你传递给该方法的具体内容。
  • 这正是问题所在。我刚刚在传递给转义方法的内容中添加了.to_s(即我从 Nokogiri 获得的输出),它就像一个魅力。感谢您的帮助!
猜你喜欢
  • 2013-05-20
  • 1970-01-01
  • 2016-04-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-14
  • 1970-01-01
  • 2016-12-02
  • 2015-09-28
相关资源
最近更新 更多