Получение инфобоксов Википедии в формате, понятном Руби

Я пытаюсь получить данные из инфобоксов Википедии в хеш или что-то еще, чтобы я мог использовать их в своей программе 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)"

Должен существовать какой-то лучший метод. Но это работает.

Другие вопросы по тегам