Как анализировать/извлекать данные из mediawiki отмеченная статья с помощью Python

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

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

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

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

Пример быть:

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

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

Вот mediawiki неофициальная спецификация (я не нахожу их официальную спецификацию как полезную).

10
задан torger 28 December 2009 в 05:44
поделиться

1 ответ

mwlib - библиотека парсеров и утилит MediaWiki

pediapress/mwlib:

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

Вот страница документация. Старая страница документации содержит пример с одним линером:

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"]

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

.
8
ответ дан 3 December 2019 в 23:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: