使用Python wikitools解析维基百科存根
我实现了一个示例,来自于这个链接: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
保存到一个私有的维基里。
下面是我为实现这个功能准备的代码(你需要把 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
保存到一个新页面。如果你的维基页面上已经有内容了,你需要先用 target_page.getWikiText()
把它读出来,然后把新内容混合进去。我还假设这篇文章的名字和它在维基百科上的名字是一样的;如果不一样,你需要修改 target_title
。