我可以使用 pywikipedia 来获取页面的文本吗?

Jam*_*hai 1 python wiki mediawiki pywikibot

是否有可能使用 pywikipedia 只获取页面的文本,而没有任何内部链接或模板,也没有图片等?

Nic*_*zet 5

如果您的意思是“我只想获取 wikitext”,请查看wikipedia.Page类和get方法。

import wikipedia

site = wikipedia.getSite('en', 'wikipedia')
page = wikipedia.Page(site, 'Test')

print page.get() # '''Test''', '''TEST''' or '''Tester''' may refer to:
#==Science and technology==
#* [[Concept inventory]] - an assessment to reveal student thinking on a topic.
# ...
Run Code Online (Sandbox Code Playgroud)

通过这种方式,您可以从文章中获得完整的原始维基文本。

如果你想去掉 wiki 语法,就像转换[[Concept inventory]]成概念清单等等,那会更痛苦一些。

这个麻烦的主要原因是MediaWiki wiki语法没有定义的语法。这使得解析和剥离变得非常困难。我目前知道没有软件可以让您准确地做到这一点。当然有 MediaWiki Parser 类,但它是 PHP,有点难以掌握,而且它的用途非常不同。

但是,如果您只想删除链接,或者非常简单的 wiki 结构,请使用正则表达式:

text = re.sub('\[\[([^\]\|]*)\]\]', '\\1', 'Lorem ipsum [[dolor]] sit amet, consectetur adipiscing elit.')
print text #Lorem ipsum dolor sit amet, consectetur adipiscing elit.
Run Code Online (Sandbox Code Playgroud)

然后对于管道链接:

text = re.sub('\[\[(?:[^\]\|]*)\|([^\]\|]*)\]\]', '\\1', 'Lorem ipsum [[dolor|DOLOR]] sit amet, consectetur adipiscing elit.')
print text #Lorem ipsum DOLOR sit amet, consectetur adipiscing elit.
Run Code Online (Sandbox Code Playgroud)

等等。

但是,例如,没有可靠的简单方法可以从页面中去除嵌套模板。评论中包含链接的图像也是如此。这非常困难,涉及递归删除最内部的链接并用标记替换它并重新开始。templateWithParams如果您愿意,可以查看wikipedia.py中的函数,但它并不漂亮。