python段子_让Python给你讲笑话、段子,一个有趣的Python案例

本文展示了如何使用Python制作一个聊天机器人,该机器人能够根据用户指令从网上抓取笑话、段子和句子,提供娱乐功能。通过requests、beautifulsoup等库解析网页数据,结合正则表达式匹配,实现对话交互。文章提供了完整代码,读者可以下载运行体验。
摘要由CSDN通过智能技术生成

前言

文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理。

作者:番茄哈哈

ps:如有需要python学习资料的小伙伴可以加点击下方链接自行获取

这次准备介绍python爬虫爬取网页数据、解析并应用于实践,打算写几篇文章,从最基础的python爬虫语法开始介绍爬虫,步步深入,最终实现一个较完整的实例。

这一系列文章包括:

request库介绍及应用

beautifulsoup库介绍及应用

正则表达式匹配及应用

对话机器人实例

tkinter库制作界面以及python程序打包成可执行exe文件

本篇文章主要给出我最后做出来的一个可运行exe应用的展示,主要的目的是提高阅读者学习的兴趣。

最后做出来的聊天机器人可以根据用户输入的指令在指定网站爬取信息,并在后台解析,返回结果输出到界面。

我将这个exe应用放在了最后,可直接在电脑运行的文件,大家可以下载自己玩或者发给好友秀一下。

运行截图入下:

用户可以输入指令,例如:“给我讲个笑话”,“给我讲个段子”,“在网上给我找句晚安的话”等。如下:

我用的开发工具是spyder,在后续的文章中我会逐渐深入的讲解这个例子的原理以及实现方法。

下面附上代码,感兴趣的同学可以拷贝自己运行试一下。

1 from tkinter import *

2 import time

3 import requests

4 from bs4 import beautifulsoup

5 import bs4

6 import random

7 import re

8 def gethtmltext(url):

9 try:

10 r = requests.get(url, timeout=30)

11 r.raise_for_status()

12 #r.encoding = r.apparent_encoding

13 return r.text

14 except:

15 print("faile")

16 return ""

17 ​

18 def fillunivlist(ulist, html):

19 soup = beautifulsoup(html, "html.parser")

20 for tr in soup.find_all('article'):

21 if isinstance(tr, bs4.element.tag):

22 tds = tr('a')

23 ulist.append([tds[0].string, tds[1].string, tds[2].string])

24 def printunivlist(ulist,k):

25 return ulist[k][0]

26 ​

27 def getduanzi():

28 uinfo = []

29 k=1

30 u = 'http://duanziwang.com/category/%e4%b8%80%e5%8f%a5%e8%af%9d%e6%ae%b5%e5%ad%90/'

31 i=random.randint(1,49)

32 url=u+str(i)+'/'

33 html = gethtmltext(url)

34 fillunivlist(uinfo, html)

35 k=random.randint(0,9)

36 return printunivlist(uinfo,k)

37 def fill2(ulist,html):

38 soup = beautifulsoup(html, "html.parser")

39 for tr in soup.find_all('div','article block untagged mb15 typs_hot'):

40 if isinstance(tr, bs4.element.tag):

41 tds = tr.find('div','content')

42 tdss=tds('span')

43 reg = re.compile(']*>')

44 text=reg.sub('',str(tdss))

45 regg = re.compile('\\[|\\]|\\n')

46 text=regg.sub('',text)

47 ulist.append(text)

48 def getjoke():

49 ulist=[]

50 u='https://www.qiushibaike.com/text/page/'

51 i=random.randint(1,13)

52 url=u+str(i)+'/'

53 html=gethtmltext(url)

54 fill2(ulist,html)

55 k=random.randint(0,16)

56 #print(str(ulist[k]))

57 return str(ulist[k])

58 def gethtmltext2(url):

59 try:

60 r = requests.get(url, timeout=30)

61 r.raise_for_status()

62 r.encoding = r.apparent_encoding

63 return r.text

64 except:

65 return ""

66 def geturl(url,text):

67 html=gethtmltext2(url)

68 soup = beautifulsoup(html, "html.parser")

69 for tds in soup.find_all('a'):

70 #print(tds.string)

71 if str(tds.string) in text:

72 #print(tds.attrs['href'])

73 return tds.attrs['href']

74 return ''

75 def getmoreurl(url):

76 html=gethtmltext2(url)

77 soup = beautifulsoup(html, "html.parser")

78 try:

79 li=soup.find_all('li',attrs={'class':'articletitle fl'})

80 k=random.randint(0,len(li)-1)

81 return li[k]('a')[0].attrs['href']

82 except:

83 return ''

84 def getsen(url):

85 html=gethtmltext2(url)

86 soup = beautifulsoup(html, "html.parser")

87 try:

88 li=soup.find('p')

89 reg = re.compile('

.*')

90 l=reg.findall(str(li))

91 #print(l)

92 k=random.randint(0,len(l)-1)

93 text=re.findall('[\u4e00-\u9fa5]+',l[k])

94 x=''

95 if len(text):

96 for t in text[:-2]:

97 x=x+t+','

98 return x+text[-1]+'。'

99 else:

100 return "不好意思,出了点小问题,请重试!"

101 except:

102 return "抱歉,没找到你想要的"

103 def getsentance(text):

104 start_url = 'http://www.siandian.com'

105 urll='http://www.siandian.com/tags.html'

106 end1=geturl(urll,text)

107 if end1=='':

108 return "抱歉,没有找到你想要的。"

109 else:

110 end2=getmoreurl(start_url+end1)

111 if end2=='':

112 return "抱歉,没有找到你想要的。"

113 else:

114 #print(start_url+end2)

115 return getsen(start_url+end2)

116 def xiaotang(s):

117 sign=1;

118 while(sign):

119 if '段子' in s:

120 while('段子' in s or '继续' in s or '再来' in s or s==''):

121 return getduanzi()

122 elif '笑话' in s:

123 while('笑话' in s or '继续' in s or '再来' in s or s==''):

124 return getjoke()

125 elif '句' in s or '话' in s:

126 return getsentance(s)

127 elif '傻子' in s or '草' in s or '日' in s:

128 return '这是脏话不可以说哦'

129 elif '二' in s or '垃圾' in s or '傻逼' in s:

130 t='你是魔鬼吗?'

131 x=''

132 for i in range(10):

133 x=x+t+' !'+'\n'

134 return x

135 else:

136 return "我好像不明白\n"

137 def main():

138 def start():

139 strmsg = '小糖:' + time.strftime("%y-%m-%d %h:%m:%s",

140 time.localtime()) + '\n '

141 txtget.insert(end, strmsg, 'redcolor')

142 txtget.insert(end, '你好,请问有什么可以帮忙的?')

143 def sendmsg():#发送消息

144 t=txtmsg.get('0.0', end)

145 txtmsg.delete('0.0', end)

146 strmsg = '我:' + time.strftime("%y-%m-%d %h:%m:%s",

147 time.localtime()) + '\n '

148 for i in range(int(txtget.index(end).split(".")[0])-int(txtmsglist.index(end).split(".")[0])+1):

149 txtmsglist.insert(end, '\n')

150 txtmsglist.insert(end, strmsg, 'greencolor')

151 txtmsglist.insert(end, t)

152 txtmsglist.see(end)

153 for i in range(int(txtmsglist.index(end).split(".")[0])-int(txtget.index(end).split(".")[0])+1):

154 txtget.insert(end, '\n')

155 txtget.see(end)

156 ​

157 ​

158 ​

159 strmsg = '小糖:' + time.strftime("%y-%m-%d %h:%m:%s",

160 time.localtime()) + '\n '

161 for i in range(int(txtmsglist.index(end).split(".")[0])-int(txtget.index(end).split(".")[0])+1):

162 txtget.insert(end, '\n')

163 txtget.insert(end, strmsg, 'redcolor')

164 txtget.insert(end, xiaotang(t))

165 txtget.see(end)

166 for i in range(int(txtget.index(end).split(".")[0])-int(txtmsglist.index(end).split(".")[0])+1):

167 txtmsglist.insert(end, '\n')

168 txtmsglist.see(end)

169 ​

170 ​

171 def cancelmsg():#取消消息

172 txtmsg.delete('0.0', end)

173 ​

174 def sendmsgevent(event): #发送消息事件

175 sendmsg()

176 ​

177 #创建窗口

178 t = tk()

179 t.title('小糖助手')

180 ​

181 #创建frame容器

182 frmlt = frame(width=500, height=320, bg='#f19c8b')

183 frmlc = frame(width=500, height=150, bg='#f19c8b')

184 frmlb = frame(width=500, height=30,bg='white')

185 frmrt = frame(width=200, height=500,bg='#f19c8b')

186 ​

187 #创建控件

188 txtmsglist = text(frmlt,width=40,bd=0)

189 txtmsglist.tag_config('greencolor', foreground='#008c00')#创建tag

190 txtmsg = text(frmlc)

191 txtget = text(frmlt,width=40,bd=0)

192 txtget.tag_config('redcolor', foreground='#dc143c')#创建tag

193 start()

194 #txtmsg.bind("", sendmsgevent)

195 txtmsg.bind('',sendmsgevent)

196 btnsend = button(frmlb, text='发 送', width = 8, command=sendmsg,bg='#e88384',bd=0)

197 btncancel = button(frmlb, text='取消', width = 8, command=cancelmsg,bg='#f3ada0',bd=0)

198 scollor=scrollbar(bg='white')

199 scollor.config(command=txtget.yview)

200 scollor.config(command=txtmsglist.yview)

201 txtget.config(yscrollcommand=scollor.set)

202 txtmsglist.config(yscrollcommand=scollor.set)

203 imginfo = photoimage(file = "aa.png")

204 lblimage = label(frmrt, image = imginfo)

205 lblimage.image = imginfo

206 ​

207 #窗口布局

208 frmlt.grid(row=0, column=0, columnspan=2, padx=0, pady=0)

209 frmlc.grid(row=1, column=0, columnspan=2, padx=0, pady=0)

210 frmlb.grid(row=2, column=0, columnspan=2,padx=0)

211 scollor.grid(row=0,column=2,sticky=n+s)

212 frmrt.grid(row=0, column=3, rowspan=3, padx=0, pady=0)

213 #固定大小

214 frmlt.grid_propagate(0)

215 frmlc.grid_propagate(0)

216 frmlb.grid_propagate(0)

217 frmrt.grid_propagate(0)

218 ​

219 btnsend.grid(row=2, column=0)

220 btncancel.grid(row=2, column=1)

221 lblimage.grid()

222 txtget.grid(row=0,column=0)

223 ​

224 txtmsglist.grid(row=0,column=1)

225 ​

226 txtmsg.grid()

227 ​

228 #主事件循环

229 t.mainloop()

230 ​

231 if __name__ == '__main__':

232 main()

如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值