Получение инфобоксов Википедии в формате, понятном Руби - PullRequest
4 голосов
/ 28 декабря 2010

Я пытаюсь получить данные из информационных блоков Википедии в хеш или что-то еще, чтобы я мог использовать их в своей программе Ruby on Rails. В частности, меня интересуют компания Infobox и человек Infobox . В качестве примера я использовал «Форд Мотор Компани». Я хочу получить информацию о компании и информацию о людях, с которыми связан сайт, в коробке компании Форда.

Я пытался выяснить, как это сделать из API Википедии или DBPedia , но мне не очень повезло. Я знаю, что википедия может возвращать некоторые вещи в формате json, которые я могу разобрать с ruby, но я не смог понять, как получить инфобокс. В случае с DBPedia я немного заблуждаюсь, как даже запросить его, чтобы получить информацию для Ford Motor Company.

Ответы [ 4 ]

8 голосов
/ 12 января 2011

Я голосую за 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 для получения ваших данных.

1 голос
/ 28 декабря 2010

Не пытайтесь анализировать HTML с помощью RegExp.

См .: RegEx соответствует открытым тегам, кроме автономных тегов XHTML

Используйте xpath или что-то подобное.

1 голос
/ 28 декабря 2010

Я посмотрел на их 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.

0 голосов
/ 28 декабря 2010

Вы можете использовать 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)"

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

...