Этот причудливый информационный блок есть в ‹какой-то статье Википедии›. Как мне узнать значение ‹этого поля и этого›?
Как извлечь информацию из информационного ящика Википедии?
Ответы (2)
Неправильный способ: попытка разобрать HTML
Для получения HTML-код статьи статьи, затем используйте парсер DOM для извлечения
table.infobox tr[3] td
/ использовать регулярное выражение.
На самом деле в большинстве случаев это действительно плохая идея. HTML-код Википедии не особенно удобен для синтаксического анализа (особенно информационные блоки, которые представляют собой систему рукописных шаблонов), точная структура меняется от информационного блока к информационному блоку, а структура информационного блока может меняться со временем. Вы также можете упустить некоторые функции, которые были бы доступны в противном случае, например интернационализацию.
Другой неправильный способ: попытка разобрать викитекст
На первый взгляд вики-текст некоторых статей выглядит так, как будто это довольно простое представление информационного окна:
{{ Infobox Foo
| param1 = bar
| param2 = 123
...
На самом деле это не так. Шаблоны рекурсивны, поэтому вы можете столкнуться с такими вещами, как param1 = {{convert|10|km|mi}}
; параметры шаблона могут содержать сложный викитекст или разметку HTML; некоторые параметры могут отсутствовать в викитексте статьи и быть извлечены шаблоном из подстраницы или другого хранилища данных. Просто выяснить, где параметр начинается и заканчивается, может быть непростым делом, если он содержит другие шаблоны, у которых есть свои собственные параметры.
Идеальный способ: использовать структурированный источник данных
Существуют различные проекты по предоставлению информации, содержащейся в информационных ящиках Википедии, в структурированной форме; два больших - это Викиданные и DBpedia.
Wikidata - это проект по созданию базы знаний, содержащей структурированные данные; он поддерживается тем же глобальным движением, которое создало Википедию, поэтому информация находится в процессе перемещения. Это ручной процесс, поэтому не вся информация в Википедии доступна через Викиданные, с другой стороны, есть много информации, которая есть в Викиданных, но не в Википедии. Вы можете найти страницу Викиданных статьи и посмотреть, какая информация в ней содержится, перейдя по ссылке Элемент Викиданных на левой панели инструментов на странице статьи; программно вы можете получить доступ к информации Викиданных с помощью модуля API wbgetentities (песочница a>, объяснение концепций), например org / w / api.php? action = wbgetentities & sites = enwiki & title = Albert_Einstein. Также существует конечная точка SPARQL, дампы базы данных и клиенты в PHP, Java и Python.
DBPedia - это проект по автоматическому сбору информации информационного ящика Википедии и публикации ее в структурированной форме. Вы можете найти страницу DBPedia для статьи в Википедии, перейдя на http://dbpedia.org/page/<Wikipedia article name>
, например http://dbpedia.org/page/Albert_Einstein. Он имеет множество форматов данных, дампы, конечную точку SPARQL и прочее.
Неправильные способы сделать правильно
Если нужная вам информация недоступна через Викиданные или DBpedia, все еще существуют полуструктурированные способы извлечения данных из информационных ящиков. Для извлечения на основе HTML вы можете использовать REST Content API (например, https://en.wikipedia.org/api/rest_v1/page/html/Albert_Einstein), который возвращает более богатый и семантический HTML, чем тот, который используется на обычных страницах статей, и сохраняет в нем некоторую информацию о структуре шаблона.
Кроме того, вы можете начать с вики-текста и преобразовать его в синтаксическое дерево, используя более простой клиентский mwparserfromhell
Модуль Python (docs) или более мощный parsoid-jsapi, который взаимодействует со службой содержания REST Википедии.
Библиотека Python более высокого уровня, которая пытается извлечь содержимое информационного окна из вики-текста, называется wptools
.
Принятый ответ верен по всем пунктам, и особенно по подтексту, что синтаксический анализ wikitexxt ужасен.
Если, однако, получение ваших данных из Викиданных не совсем подходит для вас, потому что (чисто гипотетически) вы пытаетесь переместить данные из WP в WD, я считаю, что формат, который вы ищете for - это дерево разбора. Вот как это выглядит:
<...lots of other stuff omitted>
<template lineStart= "1">
<title>Datatable TableRow</title>
<part>
<name>Picture </name>
<equals>=</equals>
<value> Picture 2013-07-26.jpg</value>
</part>
<part>
<name>Inscription </name>
<equals>=</equals>
<value> This is an Inscription on visible on the image</value>
</part>
<part>
<name>NS </name>
<equals>=</equals>
<value> 54.0902049</value>
</part>
<part>
<name>EW </name>
<equals>=</equals>
<value> 12.1364164</value>
</part>
<part>
<name>Region </name>
<equals>=</equals>
<value> DE-MV</value>
</part>
<part>
<name>Name </name>
<equals>=</equals>
<value> Person, Anna</value>
</part>
<part>
<name>Location </name>
<equals>=</equals>
<value> Lange Stra\u00dfe&nbsp;14<br /><small>ex: Lange Stra\u00dfe&nbsp;89</small></value>
</part>
<part>
<name>Date </name>
<equals>=</equals>
<value> </value>
</part>
</template>
Вот URIwiki для такого запроса API с медиа. Обратите внимание на список свойств, который включает parsetree. Я включил несколько других категорий (включая категории) на всякий случай, и вы, вероятно, захотите сократить список до того, что вам действительно нужно, чтобы сэкономить свое время и чужие серверы.