使用Python wikitools解析维基百科存根

2 投票
1 回答
1660 浏览
提问于 2025-04-17 18:51

我实现了一个示例,来自于这个链接:Mediawiki和Python

我还阅读了使用Python获取维基百科摘要如何用Python解析/提取Mediawiki格式的文章数据,以及其他几个相关的内容。

我想获取一些与某个类别相关的维基百科小条目,并把它们插入到一个内部的语义Mediawiki网站中。为了这个例子,我使用的是“Somali_Region”这个类别。这个脚本使用Mediawiki的API来获取数据,然后解析这些数据,去掉所有不需要的模板信息。

from wikitools import wiki
from wikitools import category
import mwparserfromhell

wikisite = "http://en.wikipedia.org/w/api.php"
parse_category = "Somali_Region"

wikiObject = wiki.Wiki(wikisite) 
wikiCategory = category.Category(wikiObject, parse_category)
articles = wikiCategory.getAllMembersGen(namespaces=[0])

for article in articles:
   wikiraw = article.getWikiText()
   parsedWikiText = mwparserfromhell.parse(wikiraw)
   for template in parsedWikiText.filter_templates():
      parsedWikiText.remove(template)
   print parsedWikiText

但是,如果我尝试从维基百科导出数据并插入到内部的语义Mediawiki网站时,会失败,所以这不是一个可行的选项。我想知道是否可以使用API将数据插入到这个语义Mediawiki网站中?我查看了Mediawiki API编辑页面,但没有找到Python的示例。

1 个回答

1

如果我理解得没错,你想把你的 parsedWikiText 保存到一个私有的维基里。

下面是我为实现这个功能准备的代码(你需要把 USERNAMEPASSWORD 存放在某个地方;我用的是配置文件,但还有更安全的方法)。我将从你 for 循环之前开始讲解……

# Set up and authenticate into the target wiki if you need to.
from wikitools import wiki, page
target_wiki = wiki.Wiki('http://wiki.example.com/w/api.php')
site.login(USERNAME, PASSWORD)

for article in articles:
    wikiraw = article.getWikiText()
    parsedWikiText = mwparserfromhell.parse(wikiraw)
    for template in parsedWikiText.filter_templates():
        parsedWikiText.remove(template)

    # Use the API's edit function to save the new content.
    target_title = article.title
    target_page = page.Page(target_wiki, target_title)
    result = target_page.edit(text=parsedWikiText, summary="Imported text")

    # Check to see if it worked.
    if result['edit']['result'] == 'Success':
        print 'Saved', target_title
    else:
        print 'Save failed', target_title

我假设你是想把 parsedWikiText 保存到一个新页面。如果你的维基页面上已经有内容了,你需要先用 target_page.getWikiText() 把它读出来,然后把新内容混合进去。我还假设这篇文章的名字和它在维基百科上的名字是一样的;如果不一样,你需要修改 target_title

撰写回答