真就是由于不开学闲的,我又开始第二个项目,这个项目是用python爬取唐诗三百首而后诗意取名,特别fash,里面涉及到不少知识点,我以为看完这个,你至少会了python半边江山,好比网络爬虫,程序化设计,中文分词等等----html

许久不见的老同窗生了宝宝,取名张三??我很不解的问他缘由,告诉我说孩子是三点生的,纳尼,那个人孩子是否是得叫派森啊,由于我喜欢python,以后,我就开始了这个项目,目的是为了利用古诗生成一些好听的名字,等我之后取名的时候或许还有用咧,就避免满大街的张三李四张伟王大了,汗颜无比,开始咱们的项目吧。python

来,给咱们的儿子取一个名字吧!git

项目预览:

gif预览:

页面预览:

项目技术:

网络爬虫 : requests库 , xpath语法

正则 : re库

随机库 : random库

中文分词 : jieba库

GUI界面 :tkinter库

图片处理 : PIL库

程序打包: pyinstaller库

项目思路:

这个项目的思路大体以下:经过爬虫获取唐诗三百首的全部文本,而后通过中文分词,筛选出想要的,而后组成名字,最后写入GUi界面中,喜欢的也能够打包程序,在哪都能用到了。web

本次项目也遇到一些bug,筛选词汇的特殊符号,以及筛选过程的误区,使用GUI界面定义按钮的假死状态,这些我都克服了,在下面的讲解中我会详细说说。windows

项目流程:

爬取唐诗获得文本:

网页连接以下:

http://www.shicimingju.com/shicimark/tangshisanbaishou_1_0__0.html

http://www.shicimingju.com/shicimark/tangshisanbaishou_2_0__0.html

http://www.shicimingju.com/shicimark/tangshisanbaishou_3_0__0.html网络

那么从这个就能看到每一个网页的特性了,就是1,2,3,实现一个循环就能遍历全部的页面,下面看图文源代码:多线程

首先咱们得肯定这个网页是静态的仍是动态的,我从源代码里面找到了网页的文本信息,全部我大体肯定是静态的网页,没用不少花哨东西。app

文本内容都在我指的哪一个div标签里面,这个若是不会写xpath的,能够去xpath helper 插件,这个能帮助一下吧,我我的不是很习惯用这个,有利有弊,限制本身的思路。dom

代码以下:svg

Tang_poems = [] # 诗歌列表

def get_text(page):

url = 'http://www.shicimingju.com/shicimark/tangshisanbaishou_' + page + '_0__0.html' # 拼接网址

r = requests.get(url)

if r.status_code == 200:

return r.text

def get_page_poems(text):

html = etree.HTML(text) # 造成xpath对象

html = etree.tostring(html) # 修改类型 成 bytes类型

html = etree.fromstring(html) # 修改编码

# 诗歌

poems = html.xpath(r'//*[@id="main_left"]/div[2]//div/div[@class="shici_list_main"]//text()')

for i, j in enumerate(poems): # 处理诗句 去掉空格 和 提示信息

poems[i] = j.replace('\n ', '')

poems[i] = re.sub('展开全文|收起|\n ', '', poems[i])

poems[i] = re.sub('《|》|\n ', '', poems[i])

for i in poems:

if len(i) < 2:

continue

else:

Tang_poems.append(i)

这里须要注意的,必定得先去掉明显的特殊符号,否则后面分词处理起来很麻烦,使用正则能很好的帮助咱们。

取文本然后中文分词:

这里使用到jieba库中的lcut, 分词好了就放入单个列表,好比我就放了三个列表,分别对应一个字的, 二个字的,三个字的。

代码以下:

def cut_page_poems():

name = jieba.lcut(''.join(Tang_poems))

one_name, two_name, three_name = [], [], [] # 构建名字长度列表

excludes = {',', '。', ' ', '?', '(', ')', ';', '!', '?', '/ ', '/', ': ', ':', '·', '· '} # 去掉一些特殊符号 留下牛逼名字

for i in name:

if len(i) == 1 and i not in excludes:

one_name.append(i)

elif len(i) == 2 and i not in excludes:

two_name.append(i)

elif len(i) == 3 and i not in excludes:

three_name.append(i)

# 不考虑四个名字的,由于带上姓就很长了

return one_name, two_name, three_name

这里返回的one_name里面就是存放分词后的长度,其余类推

书写GUI界面:

这里咱们简单的使用了tkinter库,由于我以前也学过这个GUI库,我以为这个有点丑,可是最简单的函数库了,其余的大家也能够尝试,若是很赞,记得评论告诉我哈,我就转库了。

代码以下:

def root(): # 生成窗口控件

my_windows = Tk() # 初始窗口

my_windows.title('取唐诗三百首然后取名') # 标题

width = 800

height = 600

# 获取屏幕尺寸以计算布局参数,让窗口位于屏幕中央

screenwidth = my_windows.winfo_screenwidth()

screenheight = my_windows.winfo_screenheight()

align_str = '%dx%d+%d+%d' % (width, height, (screenwidth - width) / 2, (screenheight - height) / 2)

my_windows.geometry(align_str) # 设置窗口大小

my_windows.resizable(width=True, height=True)

# 设置窗口是否可变长、宽,True:可变,False:不可变

photo = PIL.Image.open('D://ps素材//鲸鱼.jpg')

photo = photo.resize((1000, 600)) # 这里控制大小

photo = PIL.ImageTk.PhotoImage(photo) # 使用其余库

# 默认的PhotoImage 只能使用git格式 其余格式使用PIL

p_label = Label(my_windows, text='北冥有鱼\n其名为鲲',

fg='white', font=('华文行楷', 25),

justify=LEFT, # 对其方式

image=photo,

compound=CENTER) # 字体显示位置

p_label.pack()

# 定义第一个输入框

inp1 = Entry(my_windows)

inp1.place(relx=0.4, rely=0.2)

# 定义第二个输入框

inp2 = Entry(my_windows)

inp2.place(relx=0.4, rely=0.3)

# 定义第一个提示框

inp_label1 = Label(my_windows, text='输入姓氏:',

font=('宋体', 12), fg='Tan')

inp_label1.place(relx=0.3, rely=0.2)

# 定义第二个提示框

inp_label2 = Label(my_windows, text='名字长度:',

font=('宋体', 12), fg='Tan')

inp_label2.place(relx=0.3, rely=0.3)

# 定义一个显示文本

txt = Text(my_windows, bg='#d3fbfb')

txt.place(rely=0.6, relwidth=1.0)

# 定义一个肯定按钮 传入二个参数

btn1 = Button(my_windows, text='肯定', fg='red',

command=lambda: form_name(inp1.get(), inp2.get(), txt))

btn1.place(relx=0.4, rely=0.4)

# 定义一个关闭按钮

btn2 = Button(my_windows, text='关闭', fg='red', command=my_windows.destroy)

btn2.place(relx=0.5, rely=0.4)

# 先定义提示信息

helps = '------------They maybe can help you !---------------\n\n\n' \

'当你输入单姓的时候 ----------> 名字长度为(2-4)\n\n\n' \

'当你输入复姓的时候 ----------> 名字长度为(3-4)\n\n\n'

txt.insert(END, helps)

my_windows.mainloop()

这里使用图片的时候必定得注意库,由于tk库里面也有Image类的使用,可是这个image类只能使用gif格式的图片,因此我想上jpg就得用PIL的image类,这样就起了库名冲突,因此我这样导入PIL :

import PIL.Image

import PIL.ImageTk

这样就能避免了!这很棒!

构造GUI中的按钮函数:

在GUI里面中,我点击肯定以后就弹出了随机的名字,那么这个是经过Text控件实现的。我这里是传入的函数form_name()中,而后经过lambda传入了一些特定值,

代码以下:

def form_name(first_name, num_name, txt): # 取名

# first_name = input('请输入后代的姓氏:')

# num_name = int(input('请输入后代的名字数量:'))

# 组成名字方式不少 姓名能够一个或者二个 全名最大支持五个字

sub_num = int(num_name) - len(first_name) # 名字长度差值

if len(first_name) == 1: # 若是姓氏为单姓

if sub_num == 1:

form_two(first_name, one, txt) # 取二个名字

elif sub_num == 2:

from_three(first_name, one, two, txt) # 取三个字名字

elif sub_num == 3:

form_four(first_name, one, two, three, txt) # 取四个字名字

elif len(first_name) == 2: # 若是为复姓

if sub_num == 1:

forms_three(first_name, one, txt) # 三个名字

elif sub_num == 2:

forms_four(first_name, one, two, txt) # 四个名字

取名:

这里我使用了随机库random来实现个人功能,具体以下:

这里就展现一个组成实例了,挺多的。

def form_two(a, one, txt): # 单姓二字

s = []

for i in range(300): # 生成姓名列表

s.append(a + random.choice(one) + ' ')

txt.delete(1.0, END) # 清空文本框

for i, j in enumerate(s): # 输出姓名

if i % 16 == 0 or i == 0: # 条件限制

txt.insert(END, '\n\n\n') # 追加换行

else:

txt.insert(END, j) # 追加名字

打包程序:

使用pyinstaller库实现:

pyinstaller -F 取名.py

项目总结:

此次项目遇到很多的挫折,可是我都挺了过来,哈哈哈,不错哟!

修复了特殊符号致使的分词阻碍

抓文本的思路错误,刚开始想匹配标题和文本,结果发现这很难,诗歌有不少联,我实现不了。

在GUI界面中修复了导入图片的函数库名冲突问题,以及修复了按钮超时,界面崩溃问题,缘由是我想加入延迟,而后一次一次的打印,达到一个效果,结果有点不容许,最后仍是直接生成文本列表,而后从中选取。

我想用多线程实现界面崩溃的问题,可是我尝试了好久没有实现,若是有懂的人,但愿告诉我。

项目后记:

来自灵魂的问答,你有孩子吗,就想到起名的程序了。哎。。。。。以为喜欢的朋友给个关注和赞咯!

python 取名字_个人儿子叫派森,用python程序化取名字,他管这叫爹?相关推荐

  1. Python灰帽子_黑客与逆向工程师的Python编程之道

    收藏自用 链接:Python灰帽子_黑客与逆向工程师的Python编程之道

  2. 取名字_公司起名起名免费建筑公司取名字大全

    城镇化进程加快,对建筑业的需求非常大,所以许多人选择开建筑公司.要想建筑公司在众多公司中脱颖而出,不仅要有好的业务使人信服,还要有好的公司名字来吸引人,让消费者选择自己的建筑公司.如果大家还不知道如何 ...

  3. 取名字_新生婴儿取名字大全2021

    新生婴儿取名字大全2021 张桉宁起名分享 每个新生婴儿都是无限希望的象征,父母对其都是饱含着期待与珍爱之情的,因此在为新生婴儿取名字时可谓是费尽了心思的.那么对于在2021牛年出生的新生婴儿来说,什 ...

  4. cf服务器不显示名字,cf服务器冠名之战介绍_cf怎么给服务器取名字_游戏堡

    给服务器取名字这在之前肯定是想都不敢想,现在这个事情可以变成现实了,只要你是排名第一的战队,就会有一个专属服务器改写成为战队的名字,我们不妨来查一下自己离他们有多少距离吧! 活动规则: 1.每2周为一 ...

  5. python Series 添加行_傻傻分不清系列 | Python中各种字符串处理方法

    Python易混淆知识系列:Pandas字符串方法和字符串内建函数,使用Python的一个优势就是字符串处理起来比较容易. Python的初学者在学习字符串内建函数的时候往往会很困惑:字符串的内建函数 ...

  6. python 面试问题_值得阅读的30个Python面试问题

    python 面试问题 Interview questions are quite tricky to predict. In most cases, even peoples with great ...

  7. python vector 初始化_一文带你走进Python中的数据类

    全文共2607字,预计学习时长14分钟 图源:unsplash 数据类适用于Python3.7或更高版本,它不仅可以用作数据容器,还可以编写样板代码,简化创建类的过程. 创建第一个数据类 创建一个数据 ...

  8. python图像计数_计算机视觉:利用OpenCV和Python进行车辆计数详细步骤

    本教程我将分享几个简单步骤解释如何使用OpenCV进行Python对象计数. 需要安装一些软件: Python 3 OpennCV 1.了解Opencv从摄像头获得视频的Python脚本import ...

  9. python网页版本_利用jupyter网页版本进行python函数查询方式

    我就废话不多说了,还是直接看代码吧! import numpy world_alchol=numpy.genfromtxt("world_alcohol.txt",delimter ...

  10. 关于python的漫画_以漫画的形式写写Python之禅

    #漫画# 题记:我们经常在网络或本地的软件说明文档中,看到一些图形化的字符,看上去很抽象,很简洁,造型也相对明确,是一种计算机图形艺术(美化后的线条表现),因此,小编以为,这些图形化的字符,可以理解为 ...

最新文章

  1. springCloud入门学习(七):通过属性自定义Ribbon配置
  2. 5500以太网模块pcb布局_以太网PCB布局布线
  3. android 自启动列表,Android 机型设置自启动的跳转界面
  4. PAT (Basic Level) 1058 选择题(模拟)
  5. python里面的正则表达式_Python中的正则表达式
  6. linux网络编程之用socket实现简单客户端和服务端的通信(基于UDP)
  7. override render 方法
  8. 树莓派摄像头基础配置及测试
  9. js 点击闭包_【JS进阶】Javascript 闭包与Promise的碰撞
  10. uni-app中text文本组件的基本使用
  11. ispostback之坑
  12. Qunee for HTML5图形组件
  13. java接口分几种类型_细数Java接口的概念、分类及与抽象类的区别
  14. 《SEM长尾搜索营销策略解密》一一1.1 做有个性的账户
  15. win10如何设置计算机网络访问,win10系统设置允许或拒绝从网络中访问本地电脑的操作方法...
  16. 卫星影像0.3米到2米精度样例参照图
  17. NVMe 2.0 Telemetry
  18. XDM-跨文档消息传送
  19. 设备树学习(二十三、番外篇-中断子系统之softirq)
  20. 黑马程序员—GUI(菜单)小例子

热门文章

  1. UI设计,扁平化还是拟物化?
  2. iPhone 与 Mac 怎么同步?同步有什么用
  3. 手机功能测试主要测哪些方面?
  4. 数据库数据模型理解 概念数据模型 逻辑数据模型 物理数据模型区别和联系
  5. 控制系统中对信号求导的注意事项
  6. 基于单片机的心率监测系统设计(#0403)
  7. 必备知识:工业相机相关知识(初学者必备)
  8. 1055 集体照 (25 分)
  9. windows: 关于MsMpEng.exe导致“弹出USB大容量存储设备时出问题”
  10. 一个有效的面试——善用STAR法则