【问题标题】:Getting Wikipedia infoboxes in a format that Ruby can understand以 Ruby 可以理解的格式获取 Wikipedia 信息框
【发布时间】:2010-12-27 23:31:05
【问题描述】:

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

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

【问题讨论】:

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


【解决方案1】:

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

【讨论】:

  • (披露:您不是 DBpedia 开发人员之一吗?)
  • 现在,当我写这篇文章时,我只是(大量)参与了这个项目。
【解决方案2】:

不要尝试使用 RegExp 解析 HTML。

见:RegEx match open tags except XHTML self-contained tags

使用 xpath 或类似的东西。

【讨论】:

【解决方案3】:

我查看了他们的 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。

【讨论】:

    【解决方案4】:

    您可以使用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)"
    

    应该存在一些更好的方法。但这行得通。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多