『自残式』汉字转 pīn yīn

88次阅读
没有评论

瞎扯

前段时间站长在研究各个平台的查词典程序时(想做一个查词模块),找的了一个网站叫做:百度汉语

对于查『典』,很多人的印象都是:『字典』- 查汉语;『词典』- 查英语。看到这个自然有些惊讶,但是随之而来的想法让我开始变得冲动:

我可以拿它做一个汉字批量转拼音的程序


开始折腾

观察网页

打开这个链接,可以发现一个看起来相对古老的页面,页面只有一个偏老式的搜索框和一些百度产品(多为服务条约)的内链。广告全无,看样子是个好练手的网站。

『自残式』汉字转

如果你在手机上打开该链接,你会发现广告有点多……

输入内容规定范围有词语、成语、诗词,但是其实也支持单字查询

我随便搜了一下,可以看到结果页面基本长这样:

『自残式』汉字转

可以很清楚地看见,此时我们本文核心所需要地东西就在写法展示右边地拼音属性里。

此时,请求到的网址 URL 为 https://dict.baidu.com/s?wd=一&ptype=zici(多次尝试后地同意结果,后面指定类型为字词可能为必须),那么对于接口神偷地我们来说,接口链接就自然而然地出来啦!

开始写程序

本次还是一样,用我仅会地编程语言『Python』写程序。

或许大家有话说了,Python 不是有一个叫做 Pypinyin(python-pinyin) 的库吗?

我给你看看其工作原理:

『自残式』汉字转

这是程序文件夹内部的字典(中的一个),原理就是遍历文字完后从字典文件里找出每一个字对应的拼音然后返回,而且支持大大小小很多种形式,特别繁琐(就官方给的代码中给出的方法名我都记不住)……

你再看看本文标题:『自残式』……此处何为自残?

答:杀敌一千,自损一亿……


包和变量

这次我们需要导入以下两个包,其中 requests 需要通过 pip 进行安装

import requests  # use to request a web object.
import re  # use to match Chinese-Han-Characters by regex.

百度汉语搜索引擎链接:

url = "https://dict.baidu.com/s?wd="

用于匹配文本中的汉字的正则表达式(re 模块):

# 基础汉字和大量生僻字全在里面了
hanzi_re = re.compile(r'[\u4E00-\u9FFF\uF900-\uFA2D\u3400-\u4DBF\u2F00-\u2FD5\u2E80-\u2EF3\uE400-\uE5E8\uE600-\uE6CF\u31C0-\u31E3\u2FF0-\u2FFB\u3105-\u312F\u31A0-\u31BA\u3007]', re.S)

从获取到的网页中匹配拼音的正则表达式(re 模块):

随便搜索一个字,在其源代码页面 Ctrl + F 调用查找并搜索那个字的拼音或“拼音”两个字,

『自残式』汉字转

结果包含在一个 b 标签里,通过调试,得出正则为:

pinyin_re = re.compile(r'<span>.*?<b>(?P<pinyin>.*?)</b>.*?<a herf=.*?</span>', re.S)

函数

首先是单字查拼音:

def pinyin(hanzi):
    resp = requests.get(url + hanzi + "&ptype=zici")
    page = resp.text
    result_match = pinyin_re.search(page)
    pinyin = result_match.group("pinyin")
    return pinyin

然后就是获取文本中所有中文的拼音:

def get_all(sentence):
    hanzi = hanzi_re.findall(sentence)
    for character in hanzi:
        pinyin_of_character = pinyin(character)  # Once I use pinyin = pinyin(...) to complete an assignment, then I get an TypeError: 'str' object is not callable.
        sentence = sentence.replace(character, pinyin_of_character + " ")
    result = sentence
    return result

注意里面的注释,大意是我曾经犯的错:我用 变量名 = 函数名(参数) 的方式对变量进行赋值,但是此时的变量名和函数名是一样的,相当于第一次赋值时方法 pinyin 就从函数被赋值成了一个字符串,导致第二次调用时出现了 类型错误:‘字符串’对象不能被调用

所有的一切搞好后,就是使用了。如果不需要在程序中使用,只需要在终端窗口直接看到输出,请这样:

if __name__ == "__main__":
    while True:
        sentence = input(">>>")
        print(get_all(sentence).rstrip())  # delete the whitespace after result.

效果:

>>>极客藏源
jí kè cáng yuán
>>>认真应付,专心欠打!
rèn zhēn yìng fù ,zhuān xīn qiàn dǎ !
>>>

详解『自残』

这里的自残或许还是有人不太理解,现在来详解以下:

首先,你需要为了那 1~6 位拼音符号而请求一整个网页,这些网页的源代码一般有 3 万以上个字符组成。信息有效率:字符:1‱;大小:2B/30KB。

其次,每查一个字,就需要请求一次网页,所以字一多返回结果就会慢,影响因素有网速、与 baidu.com 的连接速度等。如果你要查的字很多,你将会付出浪费时间的代价。。

最后,你有可能因为频繁爬取页面导致被当机器处理,百度将会把你的 IP 加入黑名单。需要小心待会连百度都用不了了。

所以,除非实在手贱,不要轻易尝试这种『自残式』批量工作,你会付出很大的代价。


End

其实这个程序还是很灵活的,通过修改、增加正则,可以实现查字典功能等。喜欢的可以自己研究一下!

打包成程序

夸克网盘:https://pan.quark.cn/s/d20ca6e34d18

城通网盘:https://url72.ctfile.com/f/33764972-650086673-b7d82c?p=0116(访问密码:0116

1
灰尘疾客
版权声明:本站原创文章,由 灰尘疾客 2022-08-17发表,共计2515字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
评论(没有评论)
验证码