最近上课想给学生做一下单词表,以前有学生反映课本的单词表没有音标,这也确实是一个问题。而且以前的单词表单词和解释之间没有明显界限,不适合做成表格,更不要说生成单词卡了。所以要是能有一个词典api,我出一个单词,它告诉我音标,解释,例句就好了。

Jonathan LEI:必应词典第三方API v2.0​zhuanlan.zhihu.com

上面这个是在知乎上别人做的api,在线那种。不过现在上不去。

所以我就想,要不自己做一个吧。


目前需求比较简单(其实主要是想自动生成音标,然后查找比较公认的解释)。微软词典本身没有做api,所以现在只能模拟网页访问,然后parse返回的html页面。不过有了requests和beautifulsoup,这些都不是事。

需要的python package

如果还没有安装requests和beautifulsoup的话,使用下面的命令安装,可以带-i https://pypi.tuna.tsinghua.edu.cn/simple这个参数,会加快安装速度

pip install requests
pip install beautifulsoup4

导入会用到的包

import requests
from bs4 import BeautifulSoup
import pandas as pd
import time

DictRstParser类

不确定应该怎么写的时候,先弄个类出来总不会有大错。

class DictRstParser:

大体来说这个naive implementation的步骤包括:

  1. 使用requests.get从https://cn.bing.com/dict/search?q=拿到某个词在词典的查询结果网页。
  2. 利用beautifulsoup把网页文本转换成方便查找信息的soup形式
  3. 利用浏览器的检查工具,找到感兴趣的内容所在的html标签
  4. 使用select或者find得到这个标签,然后用get_text()函数获得里面的文本

这是最开始的设计,后面把4这步抽象成了一个函数,加入了情况判定:

    def get_content(self,from_obj,selector_str):rst = from_obj.select(selector_str)if len(rst)==0:return Noneelif len(rst)==1:return rst[0].get_text().replace("xa0"," ").strip()else:return 'n'.join([e.get_text() for e in rst])

然后就是不停的使唤这个函数了,不过复制粘贴的多了(当你粘贴次数超过三次的时候,就应该想一下自己是不是代码写的有点不对了),觉得使用dict会更好一点,目前__init__函数长这样:

    def __init__(self,word_str):self.req_link = f"https://cn.bing.com/dict/search?q={word_str}"self.res_txt = requests.get(self.req_link).textself.soup = BeautifulSoup(self.res_txt,'html.parser')self.word_info_selector_dict = {'word':'div#headword','eng_pr':'div.hd_pr','ame_pr':'div.hd_prUS','tongyi':'div.wd_div','fushu':'div.hd_div1','defination':'div.qdef > ul > li',}self.word_info_dict = {}self.related_divs = self.soup.select('div.lf_area > div')for k,v in self.word_info_selector_dict.items():self.word_info_dict[k]=self.get_content(self.related_divs[0],v)self.word_info_dict['sentences']=self.get_content(self.related_divs[1],'div#sentenceSeg')

主要的配置部分写在word_info_selector_dict 里面,然后通过遍历word_info_selector_dict .item()来实现反复使唤get_content的目的

试试这个api

现在的工作流程是将要找的单词放在一个单独的文本文件里,比如说wordlist.txt,然后在代码里面像下面这么做:

with open('wordlist.txt','r') as wordlistfile:word_list = wordlistfile.readlines()row_list = []for w in word_list:parser = DictRstParser(w)row_list.append(parser.word_info_dict)time.sleep(0.5)df = pd.DataFrame(row_list)xlwriter = pd.ExcelWriter('wordlist.xlsx',engine='xlsxwriter')
df.to_excel(xlwriter,'Sheet0')
xlwriter.save()

前面是读取wordlist.txt这个文件,然后readlines把各行弄进一个list里面。之后遍历这个list,生成 DictRstParser实例,读取做好的word_info_dict。为了防止被封,每走一个单词停半秒(time.sleep(0.5))

输出的时候用xlsx而不是csv:毕竟转码是好麻烦的一件事情,尤其是这种中英混搭还有音标的,天知道该用什么码。总之交给excel自己搞定好了

输出结果如图

需要note的一下的地方:如何逐行累积最后形成一个dataframe[1]

  1. 生成一个空的list:row_list =[]
  2. 将各行内容做成dict,逐个往list里append: row_list.append(parser.word_info_dict)
  3. 使用pandas.DataFrame()将list转成df: df = pd.DataFrame(row_list) [2]

参考

  1. ^stackoverflow上的相关讨论 https://stackoverflow.com/questions/10715965/add-one-row-to-pandas-dataframe
  2. ^pd是前面导入的时候用了import pandas as pd,这还是蛮常见的一种写法

API卡_[api]必应词典查询api,naive implementation相关推荐

  1. java跨域权重_爱站权重查询 API 接口请求调用

    原标题:爱站权重查询 API 接口请求调用 爱站权重查询 API 接口在网上已经很多且大都封装成了 API 供别人调用.支持前台跨域请求,以GET/POST方式提交即可.爱站权重查询 API 接口可以 ...

  2. delphi 调用php接口_爱站权重查询 API 接口请求调用

    爱站权重查询 API 接口在网上已经很多且大都封装成了 API 供别人调用.支持前台跨域请求,以GET/POST方式提交即可.爱站权重查询 API 接口可以查询百度权重.搜狗等级.360权重.神马权重 ...

  3. php必应收录查询api,必应 Web 搜索 API v7.0

    原标题:必应 Web 搜索 API v7.0 必应搜索v7.0 官方提供文档是php5.6x因此调整一下代码 function getbing($url,$key) { $ch = curl_init ...

  4. yii2 跨域请求配置_手机号归属地查询 API 接口调用请求

    手机号归属地查询 API 接口在网上已经很多且大都封装成了 API 供别人调用.支持前台跨域请求,以GET方式提交即可.手机号归属地查询 API 接口可以查询手机的归属地详细信息,你可以选择调用本站的 ...

  5. 1688店铺所有商品API接口(整店商品查询API接口)

    可以通过1688店铺所有商品API接口采集店铺所有商品详情页各项数据,包含商品标题,SKU信息.价格.优惠价,收藏数.销量.SKU图.标题.详情页图片等店铺内页面上有的数据均可以拿到,大家都知道,16 ...

  6. node.js api接口_如何在Node.js API客户端中正常处理故障

    node.js api接口 by Roger Jin 罗杰·金(Roger Jin) 如何在Node.js API客户端中正常处理故障 (How to gracefully handle failur ...

  7. API卡_物联网卡为何更适用于儿童电话手表

    儿童智能手表一出来,就广受家长们的喜爱.主要是家长忙于工作,不能给孩子过多的时间陪伴.当不在孩子身边的时候,难免会担心孩子安全.谁不想给孩子增加额外的安全?它的主要功能是定位和通信.但儿童的手机手表应 ...

  8. API卡_儿童电话手表该用哪种卡合适?

    儿童电话手表/智能手表是为了让家长对孩子随时定位.通信的一种装置.孩子大一点免不了要自己出去玩,家长也不能一直跟着,但又担心小孩的安全,所以电话手表的出现,刚好解决了家长这个顾虑.另外,由于电话手表还 ...

  9. API卡_浦洛电子科技代理凌华GPIB卡

    凌华科技高性价比GPIB系列产品,已连续超过10年针对数家仪器大厂持续供货,且价格低于领导品牌1/3以上,质量绝对值得信赖! 凌华科技GPIB接口卡亮点: 与您现有应用程序完全兼容 凌华科技GPIB接 ...

最新文章

  1. 最短路径(Floyd算法)(c/c++)
  2. Functor、Applicative 和 Monad x
  3. cambridge ifm strategic roadmapping takecontrol in times of uncerntainty
  4. 安装Go 1.9.2
  5. Cognos 增加全局类
  6. 用python画八卦图-使用turtle绘制太极八卦图
  7. AttributeError: ‘Polygon‘ object has no property ‘normed‘
  8. 药品缺陷检测中的机器视觉技术
  9. 雕刻机控制软件破解笔记
  10. awgn信道matlab建模,正交幅度调制信号在AWGN信道中传输的MATLAB仿真
  11. 介绍一个直接浏览微软知识库文章的工具
  12. 51c语言单片机io口控制实验报告,51单片机实训报告完整版.doc
  13. neo4j 入门例子
  14. visio任意角度精确旋转图形
  15. 基于单片机的建筑工地降尘系统
  16. 一键生成动漫头像微信小程序源码
  17. 如何找到联盟营销人员:招募合适会员的10个方法
  18. 宠物购物领养社区app(IDEA,SpringBoot,SSM,MySQL)+全套视频教程
  19. 软件工程逻辑覆盖测试
  20. 支付中心,防止重复支付的一些思路!

热门文章

  1. js中的事件对象event (获取元素的,x,y坐标)
  2. c++ 静态成员函数和非静态成员函数的区别?
  3. 写给Krpano小白们的最最最入门级教程(二)
  4. Ten Places to Go for SharePoint Development Information
  5. 微信程序开发之微信接入
  6. 阻容压降电路调试心得
  7. ABB AC500 - Programmable Logic Controllers PLCs可编程逻辑控制器
  8. 超越爱因斯坦 ——宇宙是可以理解的
  9. Linux 离线安装.net sdk
  10. [IOS APP]曾仕强演说精选-有声系列