Подтвердить что ты не робот

Как извлечь информацию из инфобокса Wikipedia?

В этой статье описывается эта необычная инфобоксная статья. Как получить значение <этого поля и этого>?

4b9b3361

Ответ 1

Неправильно: попытка разбора HTML

Используйте (cURL/jQuery/file_get_contents/requests/wget/more jQuery) для извлечения кода статьи HTML этой статьи, а затем используйте DOM-парсер для извлечения table.infobox tr[3] td/используйте регулярное выражение.

На самом деле это действительно очень плохая идея в большинстве случаев. Код HTML в Википедии не особенно удобен для анализа (особенно инфобокс, который представляет собой систему рукописных шаблонов), точная структура изменяется от инфобокса до инфобокса, а структура инфобокса может меняться со временем. Вы также можете пропустить некоторые функции, которые были бы доступны другим, например, интернационализация.

Другой неправильный путь: попытка разбора wikitext

С первого взгляда, wikitext некоторых статей выглядит как довольно простое представление инфобокса:

{{ Infobox Foo
| param1 = bar
| param2 = 123
...

На самом деле это не так. Шаблоны являются "рекурсивными", поэтому вы можете столкнуться с такими вещами, как param1 = {{convert|10|km|mi}}; параметры шаблона могут содержать сложную разметку wikitext или HTML; некоторые параметры могут отсутствовать в статье wikitext и извлекаться шаблоном из подстраницы или другого репозитория данных. Просто выяснить, где начинается и заканчивается параметр, может быть не простой бизнес, если он содержит другие шаблоны, которые имеют свои собственные параметры.

Идеальный способ: использование структурированного источника данных

Существуют различные проекты для предоставления информации, содержащейся в инфобоксах Википедии, в структурированной форме; двумя большими являются Викидата и DBpedia.

Wikidata - это проект по созданию базы знаний, содержащей структурированные данные; он поддерживается тем же глобальным движением, которое создало Википедию, поэтому информация находится в процессе перемещения. Это ручной процесс, поэтому не вся информация в Википедии доступна через Wikidata, с другой стороны, есть много информации, которая находится в Википедике, но не в Википедии. Вы можете найти страницу Wikidata статьи и посмотреть, какую информацию она содержит, указав ссылку на элемент Wikidata в левой панели инструментов на странице статьи; программным путем вы можете получить доступ к информации Викидата, используя модуль API wbgetentities (песочница, объяснение понятий), например wikidata.org/w/api.php?action=wbgetentities&sites=enwiki&titles=Albert_Einstein. Существует также конечная точка SPARQL, дампы базы данных и клиенты в PHP, Java и Python.

DBPedia - это проект сбора информации о инфобоксах Википедии автоматическими средствами и публикации в структурированной форме. Вы можете найти страницу DBPedia для статьи в Википедии, перейдя по http://dbpedia.org/page/<Wikipedia article name>, например http://dbpedia.org/page/Albert_Einstein. Он имеет множество форматов данных, дампов, конечную точку SPARQL и другие.

Неправильные пути

Если требуемая информация недоступна через Wikidata или DBpedia, все еще есть полуструктурированные способы извлечения данных из инфобокса. Для извлечения на основе HTML вы можете использовать API контента REST Wikipedia (например, https://en.wikipedia.org/api/rest_v1/page/html/Albert_Einstein), который возвращает более богатый, более семантический HTML-код, чем тот, который используется на обычных страницах статьи, и сохраняет в нем некоторую информацию о структуре шаблона.

В качестве альтернативы, вы можете начать с wikitext и проанализировать его в дереве синтаксиса, используя более простой клиентский mwparserfromhell Python mwparserfromhell (docs) или более мощный API-интерфейс Parsoid JS, который взаимодействует с сервисом контента REST Wikipedia.

Библиотека Python более высокого уровня, которая пытается извлечь содержимое инфобокса из wikitext, является wptools.