Как анализировать/извлекать данные из статьи с размеченной медиавиками через python

Источник Mediawiki-разметки

Сейчас я использую множество регулярных выражений для "разбора" данных в разметке mediawiki в списках/словарях, чтобы можно было использовать элементы в статье.

Это вряд ли лучший метод, поскольку количество дел, которые необходимо сделать, велико.

Как можно разобрать статью mediawiki разметки на различные объекты python, чтобы можно было использовать данные внутри?

Пример:

  • Извлечь все заголовки в словарь, хешируя его своим раздел.
  • Захватите все ссылки interwiki и вставьте их в список (я знаю, это можно сделать из API, но я бы скорее всего, есть один вызов API для
    уменьшить использование полосы пропускания).
  • Извлечение всех имен изображений и их удаление с помощью их разделы

Множество регулярных выражений может достичь вышеуказанного, но я нахожу номер, который я должен сделать довольно большим.

Здесь неофициальная спецификация средств массовой информации (я не вижу их официальных спецификация как полезная).

Ответ 1

mwlib - библиотека анализатора и утилиты MediaWiki

pediapress/mwlib:

mwlib предоставляет библиотеку для разбора статей MediaWiki и преобразования их в разные выходные форматы. mwlib используется функцией википедии "Печать/экспорт" для создания PDF-документов из статей в википедии.

Здесь документация. На старой странице doc используется пример с одним слоем:

from mwlib.uparser import simpleparse
simpleparse("=h1=\n*item 1\n*item2\n==h2==\nsome [[Link|caption]] there\n")

Если вы хотите увидеть, как он используется в действии, см. тестовые примеры, которые поставляются с кодом. (mwlib/tests/test_parser.py из репозитория git):

from mwlib import parser, expander, uparser
from mwlib.expander import DictDB
from mwlib.xfail import xfail
from mwlib.dummydb import DummyDB
from mwlib.refine import util, core

parse = uparser.simpleparse

def test_headings():
    r=parse(u"""
= 1 =
== 2 ==
= 3 =
""")

    sections = [x.children[0].asText().strip() for x in r.children if isinstance(x, parser.Section)]
    assert sections == [u"1", u"3"]

Также см. Спецификация разметки и Альтернативные парсеры для получения дополнительной информации.

Ответ 2

Я искал решение simillar для разбора определенной вики и наткнулся на Pandoc, который принимает несколько форматов ввода и также генерирует несколько.

С сайта:

Pandoc - универсальный конвертер документов

Если вам нужно конвертировать файлы из одного формата разметки в другой, pandoc - ваш швейцарский армейский нож. Pandoc может конвертировать документы в markdown, reStructuredText, текстиль, HTML, DocBook, LaTeX, разметку MediaWiki, разметку TWiki, OPML, Emacs Org-Mode, Txt2Tags, Microsoft Word docx, EPUB или Haddock markup для

HTML formats: XHTML, HTML5, and HTML slide shows using Slidy, reveal.js, Slideous, S5, or DZSlides.
Word processor formats: Microsoft Word docx, OpenOffice/LibreOffice ODT, OpenDocument XML
Ebooks: EPUB version 2 or 3, FictionBook2
Documentation formats: DocBook, GNU TexInfo, Groff man pages, Haddock markup
Page layout formats: InDesign ICML
Outline formats: OPML
TeX formats: LaTeX, ConTeXt, LaTeX Beamer slides
PDF via LaTeX
Lightweight markup formats: Markdown (including CommonMark), reStructuredText, AsciiDoc, MediaWiki markup, DokuWiki markup, Emacs Org-Mode, Textile
Custom formats: custom writers can be written in lua.

Ответ 4

Wiki Parser анализирует архивы Wikipedia в XML, который сохраняет весь контент и структуру статьи. Используйте это, а затем обработайте полученный XML с помощью вашей программы python.