1

我正在尝试使用以下代码使用 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

问题是它在某些网站上有效(雅虎!)但在其他网站上无效(今天的美国)

4

3 回答 3

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

哪个输出:

喷气机队解雇进攻协调员托尼·斯帕拉诺
芝加哥彩票中奖者的死亡裁定为凶杀案
于 2013-01-08T17:58:33.750 回答
1

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

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

于 2014-02-16T12:09:49.220 回答
0

解决方案:

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

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

于 2013-01-08T17:38:45.033 回答