目录
效果展示
代码详解
这段 wiki_demo.py
程序展示了如何使用 Python 的第三方库 wikipedia
来实现一个简单的维基百科查询工具。我们将从模块导入、核心函数、异常处理和程序入口四个部分进行讲解。
1.模块导入
代码使用 import wikipedia
引入了 wikipedia
库。这个库封装了维基百科的 MediaWiki API,使开发者能够通过简单的 Python 方法直接搜索和获取维基百科页面,而不必自己手动构建 HTTP 请求和解析 JSON 数据。
2.核心函数 wiki_search
该函数接受三个参数:query
表示要搜索的关键词,lang
表示维基百科语言版本(例如中文为 "zh",英文为 "en"),sentences
表示返回的摘要句子数量。函数开头调用 wikipedia.set_lang(lang)
来设置查询语言,然后尝试调用 wikipedia.summary(query, sentences=sentences)
获取页面摘要,同时用 wikipedia.page(query)
获取页面的完整信息,包括标题与 URL。最后将这些信息打包成字典返回。
3.异常处理机制。
如果遇到 wikipedia.exceptions.DisambiguationError
,表示该关键词对应多个可能的页面,例如“苹果”可能是水果或公司。这种情况下返回一个包含提示信息和候选条目列表的字典。
如果遇到 wikipedia.exceptions.PageError
,说明没有找到对应页面,此时返回一个提示未找到的错误信息。
其他任何异常都会被捕获,并返回一个通用的“查询失败”提示以及异常信息,防止程序直接崩溃。
4.程序入口
当文件作为主程序运行时,会提示用户输入关键词和语言代码。如果用户没有输入语言代码,则默认使用中文。然后调用 wiki_search
执行查询,并根据返回结果进行不同处理:如果包含 error
键,则输出错误提示,并在有候选项时列出前十个可能的页面;否则输出标题、页面 URL 以及摘要。
完整代码
# wiki_demo.py
import wikipedia
def wiki_search(query, lang="zh", sentences=3):
"""
查询维基百科摘要
:param query: 搜索关键词
:param lang: 语言代码,例如 zh(中文)、en(英文)
:param sentences: 返回的句子数
:return: 结果字符串
"""
wikipedia.set_lang(lang) # 设置语言
try:
summary = wikipedia.summary(query, sentences=sentences) # 获取摘要
page = wikipedia.page(query) # 获取完整页面对象
return {
"title": page.title,
"summary": summary,
"url": page.url
}
except wikipedia.exceptions.DisambiguationError as e:
# 歧义页,返回候选列表
return {
"error": f"关键词 '{query}' 有多个含义,请选择:",
"options": e.options[:10] # 只取前10个候选
}
except wikipedia.exceptions.PageError:
return {"error": f"未找到 '{query}' 的相关页面。"}
except Exception as e:
return {"error": f"查询失败: {str(e)}"}
if __name__ == "__main__":
# 命令行输入关键词
keyword = input("请输入要搜索的关键词:")
lang = input("请输入语言代码(默认 zh):") or "zh"
result = wiki_search(keyword, lang=lang)
if "error" in result:
print(result["error"])
if "options" in result:
print("候选条目:")
for opt in result["options"]:
print(" -", opt)
else:
print(f"标题: {result['title']}")
print(f"URL: {result['url']}")
print("摘要:", result["summary"])
重点说明
wiki_search
接受三个参数:
-
query
:要搜索的关键词,例如“人工智能”; -
lang
:语言代码,例如"zh"
表示中文,"en"
表示英文,可以细化为"zh-hans"
(简体)或"zh-hant"
(繁体); -
sentences
:摘要中返回的句子数量,默认 3 句。
在函数中,wikipedia.set_lang(lang)
会设置查询语言版本,例如选择简体或英文维基百科。
接下来使用 wikipedia.summary(query, sentences=sentences)
获取页面摘要,返回的是纯文本;再调用 wikipedia.page(query)
获取完整的页面对象,从中可以得到标题 (page.title
) 和页面 URL (page.url
)。这些信息被组合成一个字典返回。
为了防止网络错误或搜索异常导致程序崩溃,代码使用 try/except 进行分类处理:
DisambiguationError:表示该关键词有多个含义,例如“苹果”既可能是水果也可能是公司(这是我最能想到的了,但是这里居然不生效,也算是个BUG吧)。这时函数会返回错误提示,并给出前 10 个可能的候选条目。
PageError:表示找不到与关键词完全匹配的页面,返回提示信息。
其他异常:捕获所有未分类的错误,比如网络连接失败、超时等,并返回“查询失败”的提示和错误原因。