我实施了以下示例:Mediawiki and Python
我阅读了Get wikipedia abstract using python和How to parse/extract data from a mediawiki marked-up article via python以及其他几个。
我试图获取与类别相关联的一些维基百科存根的转储,并将它们插入到内部语义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 edit page,但我找不到一个python示例。
答案 0 :(得分:1)
如果我理解正确,你想带上你的parsedWikiText
并将其保存到私人wiki中。
这就是我做这种事情的方式(你需要在某处存储USERNAME
和PASSWORD
;我使用配置文件,但有更安全的方法)。我会在你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
。