【问题标题】:Making a (hopefully simple) wiki parser with python用 python 制作一个(希望是简单的)wiki 解析器
【发布时间】:2013-05-22 22:59:53
【问题描述】:

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

返回的文本包括标题的 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 对不起,如果“解析”这个词对于我在这里尝试做的事情来说太强了。

【问题讨论】:

  • 为什么还要制作另一个解析器?难道你不能只 get the HTML from the API 并使用 JavaScript/CSS 更改/设置 h2 和 h3 标签的样式吗?

标签: python parsing mediawiki wikipedia


【解决方案1】:

您可以使用正则表达式和抓取模块(如 Scrapy 和 Beautifulsoup)来解析和抓取 wiki 页面。 现在您已经澄清了您的问题,我建议您使用托管在 github 上的 py-wikimarkup 模块。链接是https://github.com/dcramer/py-wikimarkup/。我希望这会有所帮助。

【讨论】:

  • 谢谢,但我认为这不是我想要的。我已经得到了几乎完全符合我想要的格式的页面。我只想用&lt;b&gt;Heading 1&lt;/b&gt;&lt;i&gt;Heading 2&lt;/i&gt; 替换==Heading 1=====Heading 2===。我不认为 Beautifulsoup 或 Scrapy 可以帮助我。
【解决方案2】:

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

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

返回原始维基文本和

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

返回解析后的 H​​TML。

【讨论】:

  • 谢谢,我可能最终会这样做,但我已经尝试过恢复 HTML,它给了我不知道如何修复的 unicode 编码错误。另外,将 HTML 转换为纯文本也不是那么简单。也许我会尝试制作一个解析器,它只遍历文本并将每个第一个 === 替换为 并将每一秒替换为 ,然后再次遍历它并将每个 == 替换为 和每个第二个是。问题是如果计数停止它会中断,但我想它应该在大多数情况下都可以工作......
【解决方案3】:

我最终这样做了:

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 == 被转换为&lt;b&gt;title&lt;/b&gt; 而不是&lt;b&gt; title &lt;/b&gt;

到目前为止工作没有问题。

感谢大家的帮助, 亚历克斯

【讨论】:

    猜你喜欢
    • 2023-03-12
    • 2013-02-22
    • 2010-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-08
    • 2020-05-16
    相关资源
    最近更新 更多