以Ruby可以理解的格式获取Wikipedia信息框

时间:2010-12-27 23:31:05

标签: ruby web-scraping wikipedia dbpedia mediawiki-api

我正在尝试将维基百科的信息框中的数据转换为哈希值,以便我可以在Ruby on Rails程序中使用它。具体来说,我对Infobox companyInfobox person感兴趣。我一直在使用的例子是“福特汽车公司”。我想获取公司信息以及与福特公司方框相关联的人员信息。

我试过从Wikipedia APIDBPedia找出如何做到这一点,但我运气不好。我知道维基百科可以将一些东西作为json返回,我可以用ruby解析但是我无法弄清楚如何获取信息框。在DBPedia的情况下,我有点迷失于如何查询它以获取福特汽车公司的信息。

4 个答案:

答案 0 :(得分:8)

我投票支持DBpedia。

一个简单的解释是:

dbpedia命名方案为http://dbpedia.org/resource/WikipediaArticleName(唯一标识符),空格由_替换。

http://dbpedia.org/page/ArticleName(html预览)和http://dbpedia.org/data/ArticleName(.json/.jsod)是有关所需文章信息的JSON表示。 (.rdf等现在可能会让你感到困惑。)

对于福特汽车公司,您应该要求:

http://dbpedia.org/data/Ford_Motor_Company.json

或:

http://dbpedia.org/data/Ford_Motor_Company.jsod

(无论哪个更简单)

现在,根据文章类型,个人或公司,有不同的属性定义它们依赖于dbpedia本体(http://wiki.dbpedia.org/Ontology)。

更高级的步骤可能是使用SPARQL查询来获取数据。

答案 1 :(得分:1)

不要尝试使用RegEx解析HTML。

请参阅:RegEx match open tags except XHTML self-contained tags

使用xpath或类似的东西。

答案 2 :(得分:1)

我看了他们的API,看起来有很多细节,但复杂性是一个障碍。对于长期使用,最好弄明白,但是为了快速和肮脏,这是一种获取数据的方法。

我正在使用Nokogiri,它是一个XML / HTML解析器,非常灵活。为了便于使用,我正在使用CSS访问器。

#!/usr/bin/env ruby

require 'open-uri'
require 'nokogiri'
require 'uri'

URL = 'http://en.wikipedia.org/wiki/Ford_Motor_Company'
doc = Nokogiri::HTML(open(URL))
infobox = doc.at('table[class="infobox vcard"]')
infobox_caption = infobox.at('caption').text

uri = URI.parse(URL)
infobox_agents = Hash[ *infobox.search('td.agent a').map{ |a| [ a.text, uri.merge(a['href']).to_s ] }.flatten ]

require 'ap'
ap infobox_caption
ap infobox_agents

输出如下:

"Ford Motor Company"
{
              "Henry Ford" => "http://en.wikipedia.org/wiki/Henry_Ford",
    "William C. Ford, Jr." => "http://en.wikipedia.org/wiki/William_Clay_Ford,_Jr.",
      "Executive Chairman" => "http://en.wikipedia.org/wiki/Chairman",
        "Alan R. Mulally" => "http://en.wikipedia.org/wiki/Alan_Mulally",
              "President" => "http://en.wikipedia.org/wiki/President",
                    "CEO" => "http://en.wikipedia.org/wiki/Chief_executive_officer"
}

所以,它提取了标题的文本,并返回了人名的哈希值,其中键是他们的名字,值是URL。

答案 3 :(得分:0)

您可以使用open-uri下载一个Wiki页面的HTML代码,然后使用Regexp进行解释。看:

require 'open-uri'
infobox = {}
open('http://en.wikipedia.org/wiki/Wikipedia') do |page|
  page.read.scan(/<th scope="row" style="text-align:left;">(.*?)<\/th>.<td class="" style="">(.*?)<\/td>/m) do |key, value|
    infobox[key.gsub(/<.*?>/, '').strip] = value.gsub(/<.*?>/, '').strip # Removes tags (as hyperlink)
  end
end
infobox["Slogan"]                #=> "The free encyclopedia that anyone can edit."
infobox["Available language(s)"] #=> "257 active editions (276 in total)"

应该存在一些更好的方法。但这很有效。