4

我正在尝试将 Wikipedia 信息框中的数据转换为散列或其他内容,以便我可以在我的 Ruby on Rails 程序中使用它。具体来说,我对Infobox companyInfobox person感兴趣。我一直在使用的例子是“福特汽车公司”。我想获取公司信息以及福特公司邮箱中链接到的人员的人员信息。

我已经尝试从Wikipedia APIDBPedia弄清楚如何做到这一点,但我运气不佳。我知道维基百科可以返回一些我可以用 ruby​​ 解析的 json 内容,但我无法弄清楚如何获取信息框。对于 DBPedia,我什至不知道如何查询它以获取福特汽车公司的信息。

4

4 回答 4

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 查询来获取您的数据。

于 2011-01-12T17:49:22.787 回答
1

不要尝试使用 RegExp 解析 HTML。

请参阅:RegEx 匹配打开的标签,XHTML 自包含标签除外

使用 xpath 或类似的东西。

于 2010-12-28T03:23:54.373 回答
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。

于 2010-12-28T04:11:05.503 回答
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)"

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

于 2010-12-28T00:42:41.330 回答