Skip to main content
 首页 » 编程设计

python之使用 python wikitools 解析维基百科 stub

2025年05月04日7www_RR

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

我读了Get wikipedia abstract using python和 How to parse/extract data from a mediawiki marked-up article via python和其他几个。

我正在尝试获取一些与类别相关的维基百科 stub 的转储,并将它们插入内部语义 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 示例。

请您参考如下方法:

如果我没理解错的话,你想把你的parsedWikiText 保存到私有(private) 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。