API Викимедиа — Извлечение JSON или XML из ревизии викитекста для использования в переполнении стека

Я использую API Викимедиа для извлечения информации о сериалах (год, количество сезонов, жанры и т. Д.).

Я использовал такой запрос (пожалуйста, смотрите вывод):

https://en.wikipedia.org/w/api.php?action=query&проп = версия | изображения&Названия = The_Vampire_Diaries&rvprop = отметка времени | Теги | содержание&Формат = JSON

как вы можете заметить, информация мне нужна в revisions атрибут, но это все обычный текст.

Например, что если я хочу получить серию No. of seasons, Genres, Country of origin значения из этого текста?

Итак, я хотел бы спросить вас: есть ли простой способ получить доступ к этой информации?

Я имею в виду, может быть, есть способ преобразовать этот простой текст в JSON или XML таким образом, чтобы к информации было очень легко получить доступ.
Я знаю что есть parse Опция Викимедиа для анализа текста изменений в HTML, но я не думаю, что доступ к этой информации в HTML — лучший вариант для меня.

Любая идея?

Спасибо

2

Решение

Вам повезло: это не так сложно, как могло бы быть, потому что редакторы Википедии хороши и дали странице некоторую семантическую разметку.

У вас есть два варианта. Одним из них является анализ викитекста, как вы предлагаете в своем вопросе. Другой — проанализировать визуализированный HTML. Есть много библиотек для разбора HTML: разбор викитекста намного сложнее. Так что давайте разберем HTML вместо этого.

Мы будем использовать action=parse функциональность для анализа вики-текста для нас. Затем мы можем указать заголовок с page=The_Vampire_Diaries, Поскольку мы используем PHP, мы будем использовать format=php вариант.

Это дает ссылку, как это:

https://en.wikipedia.org/w/api.php?action=parse&page=The_Vampire_Diaries&format=php

Отлично. Теперь у нас есть визуализированный вики-текст. Давайте поместим это в переменную PHP:

$url = '...'; // as above
$apiResult = file_get_contents($url);

$parsedResult = unserialize($apiResult);

$renderedHTML = $parsedResult['parse']['text']['*'];

Теперь у нас есть HTML-код для страницы.

Давайте использовать класс DOMDocument, чтобы получить элементы, которые мы хотим. Нам повезло, что у ряда есть класс: category, Затем мы хотим прямой потомок a элементы.

$dom = new DOMDocument;

$dom->loadHTML($renderedHTML);
$xpath = new DOMXPath($dom);

$elements = $xpath->query('//*[contains(@class, \'category\')]/a');

$genres = array();

foreach($elements as $element) {
$genres[] = $element->nodeValue;
}

Итак $genres массив теперь содержит значения, которые вы хотите. var_export дает это:

array (
0 => 'Supernatural drama',
1 => 'Horror',
2 => 'Fantasy',
3 => 'Romance',
)

Это, конечно, довольно уязвимо. Если HTML-код значительно изменился, ваш код может работать не так хорошо. Вы, вероятно, также хотите сделать некоторые проверки ошибок, например перед звонком unserialize а также loadHTML,

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]