Я использую API Викимедиа для извлечения информации о сериалах (год, количество сезонов, жанры и т. Д.).
Я использовал такой запрос (пожалуйста, смотрите вывод):
как вы можете заметить, информация мне нужна в revisions
атрибут, но это все обычный текст.
Например, что если я хочу получить серию No. of seasons
, Genres
, Country of origin
значения из этого текста?
Итак, я хотел бы спросить вас: есть ли простой способ получить доступ к этой информации?
Я имею в виду, может быть, есть способ преобразовать этот простой текст в JSON или XML таким образом, чтобы к информации было очень легко получить доступ.
Я знаю что есть parse
Опция Викимедиа для анализа текста изменений в HTML, но я не думаю, что доступ к этой информации в HTML — лучший вариант для меня.
Любая идея?
Спасибо
Вам повезло: это не так сложно, как могло бы быть, потому что редакторы Википедии хороши и дали странице некоторую семантическую разметку.
У вас есть два варианта. Одним из них является анализ викитекста, как вы предлагаете в своем вопросе. Другой — проанализировать визуализированный 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
,
Других решений пока нет …