2013-03-12 82 views
2

我实现了从例如:Mediawiki and Python解析维基百科存根使用python wikitools

我读Get wikipedia abstract using pythonHow 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

你试过了'pywikipediabot'吗?我还没有尝试'wikitools',但它看起来不错,我很快就会试用它。我有'pywikipediabot'的良好体验。 – guaka 2014-01-04 19:07:17

回答

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到一个新的页面。如果你的wiki页面上已经有东西,你必须先用target_page.getWikiText()先阅读它,然后以某种方式混合新文本。我还假定这篇文章将与维基百科中的文章具有相同的名称;如果不是则更改target_title