用python制作一个(希望很简单的)wiki解析器

时间:2013-05-28 04:59:00

标签: python parsing mediawiki wikipedia

在joksnet的程序here的帮助下,我设法获得了我正在寻找的纯文本维基百科文章。

返回的文本包含标题的Wiki标记,例如,Albert Einstein article的部分返回如下:

==Biography==

===Early life and education===
blah blah blah

我真正想做的是将检索到的文本提供给一个函数,并将所有顶级部分包含在粗体html标签中,将第二级部分包含在斜体中,如下所示:

<b>Biography</b>

<i>Early life and education</i>
blah blah blah

但是我害怕我不知道如何开始,至少在没有使这个功能变得危险的时候也是如此。我需要使用正则表达式吗? 任何建议都非常感谢。

PS对不起,如果“解析”对于我在这里尝试做的事情来说过于强烈。

3 个答案:

答案 0 :(得分:2)

我认为这里最好的方法是让MediaWiki负责解析。我不知道你正在使用的库,但基本上这是

之间的区别

http://en.wikipedia.org/w/api.php?action=query&prop=revisions&titles=Albert%20Einstein&rvprop=content

返回原始wiki文本和

http://en.wikipedia.org/w/api.php?action=query&prop=revisions&titles=Albert%20Einstein&rvprop=content&rvparse

返回解析的HTML。

答案 1 :(得分:1)

你可以使用像Scrapy和Beautifulsoup这样的正则表达式和抓取模块来解析和抓取维基页面。 既然你澄清了你的问题,我建议你使用github上托管的py-wikimarkup模块。链接是https://github.com/dcramer/py-wikimarkup/。我希望有所帮助。

答案 2 :(得分:1)

我最终这样做了:

def parseWikiTitles(x):
    counter = 1

    while '===' in x:
        if counter == 1:
            x = x.replace('===','<i>',1)
            counter = 2

        else:
            x = x.replace('===',r'</i>',1)
            counter = 1

    counter = 1

    while '==' in x:
        if counter == 1:
            x = x.replace('==','<b>',1)
            counter = 2

        else:
            x = x.replace('==',r'</b>',1)
            counter = 1


    x = x.replace('<b> ', '<b>', 50)
    x = x.replace(r' </b>', r'</b>', 50)
    x = x.replace('<i> ', '<i>', 50)
    x = x.replace(r' </i>', r'<i>', 50)

    return x

我将带有wiki标题的文本字符串传递给该函数,并返回相同的文本,其中==和===替换为粗体和斜体HTML标记。最后一件事删除标题之前和之后的空格,例如== title ==转换为<b>title</b>而不是<b> title </b>

到目前为止没有问题。

感谢帮助人员, 亚历