2

我从以下位置实现了示例:Mediawiki 和 Python

我阅读了Get wikipedia abstract using pythonHow to parse/extract data from a mediawiki mark-up article via python和其他几篇文章。

我正在尝试获取与某个类别相关的一些维基百科存根的转储,并将它们插入到内部语义媒体维基站点中。出于本示例的目的,我使用“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

如果我尝试从维基百科进行转储并进行插入,则内部语义媒体维基站点会失败,因此这不是一个选项。是否可以使用 API 将数据插入语义媒体维基站点?我阅读了mediawiki API 编辑页面,但找不到 python 示例。

4

1 回答 1

1

如果我理解正确,您希望parsedWikiText将其保存到私人 wiki 中。

这就是我做这种事情的方法(你需要存储在某个地方;我使用配置文件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到新页面中。如果您的 wiki 页面上已经有内容,您必须先阅读它target_page.getWikiText(),然后以某种方式混合新文本。我还假设该文章将与维基百科中的名称相同;如果没有那么改变target_title

于 2014-06-25T19:07:53.830 回答