如何使用httparty for rails 3解析og元标记

时间:2013-01-08 17:38:45

标签: ruby-on-rails ruby opengraph httparty

我正在尝试使用此代码使用HTTParty gem解析og元标记:

link = http://www.usatoday.com/story/gameon/2013/01/08/nfl-jets-tony-sparano-fired/1817037/
# link = http://news.yahoo.com/chicago-lottery-winners-death-ruled-homicide-181627271.html
resp = HTTParty.get(link)
ret_body = resp.body

# title
  og_title = ret_body.match(/\<[Mm][Ee][Tt][Aa] property\=\"og:title\"\ content\=\"(.*?)\"\/\>/)
  og_title = og_title[1].to_s

问题在于它适用于某些网站(雅虎!)但不适用于其他网站(今日美国)

3 个答案:

答案 0 :(得分:4)

不要使用正则表达式解析HTML,因为除了最简单的问题之外,它们太脆弱了。对HTML的微小改动可以打破这种模式,导致你开始一场保持不断扩大的模式的缓慢战斗。这是一场你不会赢的战争。

相反,请使用HTML解析器。 Ruby有Nokogiri,非常棒。这就是我想做你想做的事情:

require 'nokogiri'
require 'httparty'

%w[
  http://www.usatoday.com/story/gameon/2013/01/08/nfl-jets-tony-sparano-fired/1817037/
  http://news.yahoo.com/chicago-lottery-winners-death-ruled-homicide-181627271.html
].each do |link|
  resp = HTTParty.get(link)

  doc = Nokogiri::HTML(resp.body)
  puts doc.at('meta[property="og:title"]')['content']
end

哪个输出:

Jets fire offensive coordinator Tony Sparano
Chicago lottery winner's death ruled a homicide

答案 1 :(得分:1)

也许我可以提供更简单的解决方案?查看OpenGraph gem。

这是一个简单的库,用于从网站解析Open Graph协议信息,并且可以解决您的问题。

答案 2 :(得分:0)

解决方案:

og_title = ret_body.match(/\<[Mm][Ee][Tt][Aa] property\=\"og:title\"\ content\=\"(.*?)\"[\s\/\>|\/\>]/)
og_title = og_title[1].to_s

尾随空白搞砸了解析,所以一定要检查一下。我在正则表达式中添加了一个OR子句,以允许尾随空格和非尾随空格。