使用pythonwikitools解析wikipedia存根

2024-05-19 01:44:39 发布

您现在位置:Python中文网/ 问答频道 /正文

我实现了示例:Mediawiki and Python

我读了Get wikipedia abstract using python和{a3}以及其他一些。在

我正在尝试获取一些与类别相关的Wikipedia存根的转储,并将它们插入到内部语义mediawiki站点中。在本例中,我使用“索马里地区”类别。脚本使用mediawikiapi获取数据,然后解析数据,删除所有需要的模板信息。在

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

如果我尝试从wikipedia转储并执行insert,则内部语义mediawiki站点将失败,因此这不是一个选项。是否可以使用API将数据插入语义mediawiki站点?我读了mediawiki API edit page,但找不到python示例。在


Tags: 数据fromimport示例站点parsewiki语义
1条回答
网友
1楼 · 发布于 2024-05-19 01:44:39

如果我没听错,你想把你的parsedWikiText保存到一个私有wiki中。在

下面是我做这类事情的方法(您需要将USERNAME和{}存储在某个地方;我使用一个配置文件,但还有更安全的方法)。我会在你的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()来阅读,然后以某种方式混合新文本。我还假设这篇文章将与Wikipedia中的同名;如果不是,那么就改target_title。在

相关问题 更多 >

    热门问题