基于Python实现西西成语接龙小助手
本文介绍如何使用Python开发一个成语接龙小助手。通过爬虫模块获取包含拼音、释义等详细属性的成语数据,并利用前缀树(Trie Tree)构建高效搜索提示功能。程序支持简单与困难两种模式,提供逐步提示、成语详情查看及错误处理,适合Python初学者学习爬虫与数据结构应用。
介绍
项目代码已开源,地址为:https://github.com/taishan1994/chinese_chengyujielong
阅读完本文后,你将掌握以下技能:
- Python网络爬虫的基础使用方法。
- 利用前缀树(Trie Tree)构建搜索提示系统。
- 开发并运行一个简易的成语接龙交互程序。
爬虫模块
首先展示最终获取的成语数据样例:
,成语,拼音,成语解释,典故出处,近义词,反义词,常用程度,感情色彩,语法用法,成语结构,产生年代,英文翻译,成语谜面
0,阿匼取容,ē ǎn qǔ róng,阿匼:一味迎合的样子。一味巴结别人以求得他们的喜欢,《新唐书 杨再思传》:“居宰相十余年,阿匼取容,无所荐达。”,阿谀取容,刚正不阿,生僻,贬义词,作谓语、定语;用于人,联合式,古代,,
1,阿姑阿翁,ā gū ā wēng,阿:名词的前缀。姑:丈夫的母亲。翁:丈夫的父亲。指公公婆婆。,见:“阿家阿翁”。,阿家阿翁,,一般,褒义词,作主语、宾语;指公公婆婆,联合式,近代,father-in-law and mother-in-law,
2,阿娇金屋,ā jiāo jīn wū,阿娇:指汉武帝刘彻的姑母(长公主刘娇)的女儿。原指汉武帝刘彻要用金屋接纳阿娇为妇。这里泛指美丽高贵的女子。,语出旧题汉·班固《汉武故事》:汉武帝幼时曾对姑母长公主说:“若得阿娇(姑母之女)作妇,当以金屋贮之。”,金屋藏娇,,一般,褒义词,作宾语、定语;多用于女性,偏正式,古代,,
3,阿家阿翁,ā jiā ā wēng,阿:名词的前缀。家:通“姑”,丈夫的母亲。翁:丈夫的父亲。指公公婆婆。,唐·赵璘《因话录》卷一:“郭暖尝与升平公主琴瑟不调。尚父拘暖,自诣朝童结罪。上召而慰之曰:‘谚云:不痴不聋,不作阿家阿翁。'”,阿公阿婆,,一般,褒义词,作主语、宾语;指公公婆婆,联合式,古代,husband's father and mother,
4,阿平绝倒,ā píng jué dǎo,以之比喻对对方的言论极为佩服。亦用为讥讽言论极为乖谬,常贻笑大方。,据《晋书·卫玠传》及《王澄传》载:玠好言玄理。琅玡王澄字平子,兄昵称之曰:“阿平”。有高名,少所推许,每闻玠言,辄叹息绝倒。故时为之语曰:“卫玠谈道,平子绝倒。”,,,一般,,,,,,
5,阿斗太子,ā dǒu tài zǐ,阿斗:三国蜀汉刘备之子刘禅的小名。此人庸碌无能,虽有诸葛亮等人全力扶助,也不能振兴蜀汉。指懦弱无能的人,高阳《胡雪岩全传 灯火楼台》:“丈夫是个阿斗太子,哪怕你是诸葛亮,也只好叹口气。”,扶不起的阿斗,,常用,贬义词,作主语、宾语、定语;多用于比喻句,偏正式,现代,an ignorant and incapable man <good-for-nothing fellow>,刘禅
每条成语记录包含以下字段:成语、拼音、成语解释、典故出处、近义词、反义词、常用程度、感情色彩、语法用法、成语结构、产生年代、英文翻译、成语谜面。具体数据获取逻辑位于 spider.py 文件中,直接运行 parse_url3_detail() 函数即可生成上述数据。接下来我们分析数据来源网页结构:

首先需要获取每一页的初始列表信息,相关逻辑在 get_all_chengyu3() 函数中被注释部分涵盖,获取后数据已保存。随后点击任意一个成语进入详情页:

观察发现,所有关键信息均位于 class 属性为 view_con clearfix 的 div 标签内。我们可以利用 BeautifulSoup 库的 find 方法定位该标签,例如使用代码:div = soup.find("div", {"class":"view_con clearfix"}),进而提取该标签下的具体数据内容:
dl = div.find("dl")
dts = dl.find_all("dt")
dds = dl.find_all("dd")
for dt,dd in zip(dts, dds):
cate = dt.text.replace('[', '')
cate = cate.replace(']', '')
cate = cate.strip()
content = dd.text
content = content.strip()
通过 .text 属性可以提取标签包裹的纯文本内容,例如:
作谓语、定语;用于人
即可获取到“作谓语、定语;用于人”这一语法用法描述。
前缀树搜索提示
相关代码位于 trie.py 文件中。前缀树的构建过程较为直观:遍历成语列表,将每个成语按字符或子串拆解并存储到对应的节点中。在搜索阶段,以特定字或词作为键,即可直接获取对应的成语列表:
# coding:utf-8
"""
利用前缀树进行搜索提示
"""
class TrieTree(object):
def __init__(self):
self.dict_trie = dict()
def add_node(self, word):
word = word.strip()
tree = self.dict_trie
for i in range(1, len(word)+1):
char = word[:i]
if char not in tree:
tree[char] = [word]
else:
tree[char].append(word)
def build_trie_tree(self, cy_list):
""" 创建 trie 树 """
for word in cy_list:
self.add_node(word)
def search(self, word):
""" 搜索给定 word 字符串中与词典匹配的 entity,
返回值 None 代表字符串中没有要找的实体,
如果返回字符串,则该字符串就是所要找的词汇的类型
"""
tree = self.dict_trie
res = tree.get(word, None)
return res
if __name__ == '__main__':
import pandas as pd
from pprint import pprint
trie = TrieTree()
data = pd.read_csv("data/cycd.csv")
cys = data["成语"].values.tolist()
trie.build_trie_tree(cys)
# pprint(trie.dict_trie)
print(trie.search("略"))
['略不世出', '略地侵城', '略地攻城', '略施小计', '略无忌惮', '略知一二', '略知皮毛', '略窥一斑', '略胜一筹', '略见一斑', '略逊一筹', '略高一筹', '略识之无', '略迹原心', '略迹原情', '略迹论心']
成语接龙
主程序位于 cyjl.py 文件中,运行程序后初始界面如下:
==============================
=== 欢迎进行西西嘛呦成语接龙游戏 ===
请选择难度(输入1(简单),输入2(困难))
难度:2
其中的“困难模式”是指系统在回答时会统计该成语最后一个字在语料库中作为开头出现的频率,并优先返回出现次数最少的成语,从而增加回答难度。程序随后会给出一个初始字:
出题: 株
此时,用户可以输入“提示”来获取第一阶段的线索,主要显示其中一个候选成语的解释。如果仍不确定,再次输入“再提示”,系统将给出该成语的前三个字。若依然无法回答,输入“看看”,程序将展示可能的几个结果(需注意,提示的成语可能不在返回的前5个结果中)。此外,若想了解特定成语的详细信息,可输入“介绍 成语名”,程序将展示该成语的各项属性。对于输入空值或不合法指令的情况,程序已进行异常处理,不会影响整体运行。
出题: 袖
你的回答:提示
提示:成语解释-- 袖手:藏手于袖中;充耳:塞住耳朵。指不闻不问,漠然置之
你的回答:再提示
提示:前三个字-- 袖手充...
你的回答:看看
['袖中挥拳', '袖手傍观', '袖手充耳', '袖手旁观', '袖里乾坤']
你的回答:介绍 袖手充耳
==============================
成语:袖手充耳
拼音:xiù shǒu chōng ěr
成语解释:袖手:藏手于袖中;充耳:塞住耳朵。指不闻不问,漠然置之
典故出处:清·夏燮《中西纪事·江上议款》:“既不能誓师讨贼,视其力之所能为,则当袖手充耳,姑听命于发踪指示之人。”
近义词:袖手旁观、充耳不闻、漠然置之
反义词:nan
常用程度:一般
感情色彩:褒义词
语法用法:作谓语、定语;用于处事
成语结构:联合式
产生年代:近代
英文翻译:nan
成语谜面:nan
==============================
你的回答:至此,关于基于Python实现西西成语接龙小助手的介绍完毕。如需了解更多Python成语接龙相关内容,请搜索本站往期文章或继续浏览后续文章,感谢大家的支持!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









