我正在尝试将维基百科的信息框中的数据转换为哈希值,以便我可以在Ruby on Rails程序中使用它。具体来说,我对Infobox company和Infobox person感兴趣。我一直在使用的例子是“福特汽车公司”。我想获取公司信息以及与福特公司方框相关联的人员信息。
我试过从Wikipedia API或DBPedia找出如何做到这一点,但我运气不好。我知道维基百科可以将一些东西作为json返回,我可以用ruby解析但是我无法弄清楚如何获取信息框。在DBPedia的情况下,我有点迷失于如何查询它以获取福特汽车公司的信息。
答案 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)
答案 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)"
应该存在一些更好的方法。但这很有效。