Как анализировать/извлекать данные из статьи с размеченной медиавиками через 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.
Ответ 3
Этот вопрос старый, но для других, приходящих сюда: есть редактор средств массовой информации, написанный на Python в github. Кажется очень легко преобразовать статьи в чистый текстовый текст, что-то, если я правильно помню, не мог решить в прошлом с помощью mwlib.
Ответ 4
Wiki Parser анализирует архивы Wikipedia в XML, который сохраняет весь контент и структуру статьи. Используйте это, а затем обработайте полученный XML с помощью вашей программы python.