Получение инфобоксов Википедии в формате, понятном Руби
Я пытаюсь получить данные из инфобоксов Википедии в хеш или что-то еще, чтобы я мог использовать их в своей программе Ruby on Rails. В частности, я заинтересован в компании Infobox и человеке Infobox. В качестве примера я использовал "Форд Мотор Компани". Я хочу получить информацию о компании и информацию о людях, с которыми связан сайт, в коробке компании Форда.
Я пытался выяснить, как это сделать с помощью API Википедии или DBPedia, но мне не очень повезло. Я знаю, что википедия может возвращать некоторые вещи в формате json, которые я могу проанализировать с помощью ruby, но я так и не смог понять, как получить инфобокс. В случае с DBPedia я как бы растерялся, как даже запросить его, чтобы получить информацию для Ford Motor Company.
4 ответа
Я голосую за DBpedia.
Простое объяснение:
Схема именования dbpedia: http://dbpedia.org/resource/WikipediaArticleName (уникальный идентификатор) с пробелами, замененными на _
,
http://dbpedia.org/page/ArticleName (предварительный просмотр html) и http://dbpedia.org/data/ArticleName(.json/.jsod) представляют собой представление JSON для информации о статье, которую вы хотите. (.rdf и т. д. может сбить вас с толку прямо сейчас.)
Для Ford Motor Company вы должны попросить:
http://dbpedia.org/data/Ford_Motor_Company.json
или же:
http://dbpedia.org/data/Ford_Motor_Company.jsod
(Что проще для вас)
Теперь, в зависимости от типа статьи, человека или компании, существуют различные свойства, которые определяют их, которые зависят от онтологии dbpedia ( http://wiki.dbpedia.org/Ontology).
Более сложным шагом может быть использование SPARQL-запросов для получения ваших данных.
Не пытайтесь анализировать HTML с помощью RegExp.
См.: RegEx соответствует открытым тегам, кроме автономных тегов XHTML
Используйте xpath или что-то подобное.
Я посмотрел на их 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-адреса.
Ты можешь использовать open-uri
загрузить 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)"
Должен существовать какой-то лучший метод. Но это работает.