Как получить внутреннюю ссылку из последней версии страницы википедии?

Я пытаюсь извлечь внутренние ссылки со страниц википедии. Это запрос, который я использую

/w/api.php?action=query&prop=links&format=xml&plnamespace=0&pllimit=max&titles=pageTitle

Однако результат не отражает того, что находится на вики-странице. Возьмем, к примеру, случайную статью здесь. На этой странице всего дюжина ссылок. Однако, когда я делаю запрос,

/w/api.php?action=query&prop=links&format=xml&plnamespace=0&pllimit=max&titles=Von_Mises%E2%80%93Fisher_distribution

Я получил обратно 187 ссылок. Я предполагаю, что у API может быть база данных всех ссылок, которые когда-либо добавлялись на страницу, включая все версии. Так ли это? Как я могу получить ссылки только из последней версии?


person chepukha    schedule 12.03.2014    source источник
comment
Может быть, вы забыли о ссылках в навигационном окне? Из того, что я вижу, все ссылки из ответа API находятся на странице. Можете привести пример ссылки, которой там быть не должно?   -  person leo    schedule 13.03.2014
comment
+1. Ты прав, Лео. К сожалению, API не позволяет указать, из какого раздела страницы извлекать ссылки :(   -  person chepukha    schedule 13.03.2014


Ответы (1)


В базе есть правильный список ссылок в текущей версии статей. Все ссылки, которые вы получаете от API, на самом деле находятся в статье. Однако большинство из них скрыты в (дважды свернутом) окне навигации внизу (прокрутите вниз, нажмите «показать» на синей полосе, затем нажмите «показать» на дополнительных синих полосах, которые вы теперь видите).

Обратите внимание, что эти ссылки находятся на странице, но не определены в викитексте — они взяты из шаблона навигации {{ProbDistributions}} (и шаблона, который, в свою очередь, включает этот шаблон).

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

person brightbyte    schedule 13.03.2014
comment
+1. Я понимаю. Это делает вещь более сложной, чем я ожидал. В этом случае, я думаю, лучший способ — разобрать викитекст. но знаете ли вы какой-нибудь доступный синтаксический анализатор, который подходит для этой работы? Спасибо. - person chepukha; 13.03.2014
comment
К сожалению, синтаксис MediaWiki очень запутан, и называть то, что превращает его в HTML, синтаксическим анализатором, значит использовать этот термин очень ошибочно. Это очень затрудняет повторную реализацию точного поведения канонического синтаксического анализатора. Закрытия, которые у нас есть, это Parsoid, но есть куча приличных парсеров, которые должны быть достаточно хороши, чтобы получить ссылки. Посмотрите здесь: mediawiki.org/wiki/Alternative_parsers - person brightbyte; 17.03.2014
comment
Если все, что вам нужно, это извлечь ссылки, вы, вероятно, можете использовать код из фреймворка PyWikipedia или похожей библиотеки. Су также stackoverflow.com/questions/1968132/ - person brightbyte; 17.03.2014