可能问题描述的不是很清楚...
事情源于我们英语课留了个作业要背单词什么的 五百多个词懒得一个个去查了 想写个爬虫自动搜索必应词典上的翻译然后我就可以直接看了
感觉这个正则表达式的匹配有点难写(对于我来说...)
本来想用BeautifulSoup...但是能力不够完成不了...
所以用了个笨办法,先用requests.get()把差不多包含了翻译的源码存起来,然后用正则表达式。
我的代码是这样的:
#usr/bin/env python3
# -*- coding: utf-8 -*-
# vocabulary list 自动补全中文
# 做的不太好...待改进
import requests, re, os
# 读取文件获得单词列表
os.chdir("D:\\")
file = open("D:\\English.txt", 'r', encoding = 'UTF-8')
new_file = open("D:\\vocabulary_list.txt", "w", encoding = 'UTF-8')
vocabulary = file.read()
words = vocabulary.split()
# 对列表中元素进行分类处理
words_list = []
for word in words:
numRegex = re.compile(r'\d')
numMo = numRegex.search(word)
try:
words_list.append(numMo.group())
except:
# 爬虫
kv = {'q' : word}
r = requests.get("http://cn.bing.com/dict/search", params = kv)
try:
r.raise_for_status()
except:
print("啊这里出了一点问题")
text = r.text[400:600]
regex = re.compile(r'(n|v|pron|adj|adv|num|art|prep|conj|int)(\.)(.*)')
mo = regex.search(text)
try:
expression = mo.group()
words_list.append(word + ' ' + expression)
except:
print('未查找到')
# 写入文件
for word in words_list:
new_file.write(word + '\n')
# 关闭文件
file.close()
new_file.close()
print('已完成')
其中的文件大概长这样:
English.txt:
运行结束后的vocabulary_list.txt是这样的:(只截图中间一部分)
就觉得做的不够好吧...
希望大佬们给本小白一点建议...
先谢过好心的大佬们了~
原问题如上...
根据建议修改了代码,但是老是提醒说li是NoneType...挂上来看看有什么问题...
# 改过的vocabulary.py
import requests, os
import bs4
os.chdir("D:\\")
with open(".\\English.txt", 'r', encoding = 'UTF-8') as file_in:
words = file_in.read().split()
with open(".\\new_vocabulary_list.txt",'w', encoding = 'UTF-8') as file_out:
for word in words:
file_out.write(word)
file_out.write('\n')
r = requests.get("http://cn.bing.com/dict/search?q="+word)
r.encoding = r.apparent_encoding
markup = r.text
soup = bs4.BeautifulSoup(markup, "html.parser")
root_element = soup.find(class_="qdef").find("ul") # 寻找class为qdef的节点下的ul节点(至于为何是“class为qdef的节点”,请查看网页源代码)
for li in root_element.find_all("li"):
file_out.write('\t')
if 'web' not in li.find(class_="pos")['class']:
file_out.write(li.find(class_="pos").string)
file_out.write(' ')
file_out.write(li.find(class_="def").string)
file_out.write('\n')
先上一个根据你的代码改的版本
再上一个自己用beautiful soup弄的版本(我没有做错误处理,但是可以容易地加进去):
结果: