我正在尝试使用此代码使用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
问题在于它适用于某些网站(雅虎!)但不适用于其他网站(今日美国)
答案 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子句,以允许尾随空格和非尾随空格。