请完成一个程序,并能按步骤实现以下功能:
1. 下载https://en.wikipedia.org/wiki/Machine_translation 页面的
内容并保存为mt.html
需要编写代码来下载页面。
2. 统计mt.html中
标签内下所有单词以及数目并存储到mt_word.txt中。
mt_word.txt有如下几点要求:
a) 每个单词一行。单词在前,单词出现的次数在后,中间用Tab(\t)进行分隔。
b) 单词要按照单词数目从多到少的顺序进行排列。
比如说单词a出现了100次,单词b出现了10次,则单词a要在单词b的前面。
题目解析:
理清思路是解题的关键!
首先我们可以利用urllib.request里的urlopen方法来抓取网页的源代码
利用open函数新建一个mt.html的文件将抓取的源代码写入.
然后读取刚刚创建的文件,将内容利用正则表达式的findall方法提取出
标签内所有单词
然后利用sub方法将文件内的非字母字符替换为空格,再利用split将字符串以空格为界分割至列表.
最后利用列表操作计算出每个单词的次数存入二维列表,然后将列表根据数字排序后循环将包含单词以及数字的列表写入文件,关闭文件.
代码如下:
import re
import urllib.request
def grab():
web_addr = "https://en.wikipedia.org/wiki/Machine_translation"
# 请求网页
file = urllib.request.urlopen(web_addr)
# 读取网页源码
data = file.read()
# 打开文件写入
new_file = open("mt.html", "wb")
new_file.write(data)
new_file.close()
def grab_word():
#打开文件读取
new_file = open("mt.html", "r")
data = new_file.read()
new_file.close()
# 利用正则匹配处要求的内容
word_list = re.findall(r"<p>.*</p>", data)
# 将非字母替换为空
words = re.sub(r"[^A-Za-z]", " ", (re.sub(r"<[^>]+>", " ", str(word_list))))
# 将所有非空单词放入列表
last_list = re.findall(r"\S+", str(words))
# 定义空列表用于接受最终的数据
list1 = []
# 去重
a = set(last_list)
# 便利去重后的列表依次判断在总列表内出现的次数,并将单词与次数放入list1列表内
for word in a:
list1.append([word,str(last_list).count(word)])
# 根据列表内的子列表的1下标进行排序
list1.sort(key=lambda x: x[1],reverse=True)
# 打开文件写入
with open("mt_word.txt","w") as last_file:
for i in list1:
last_file.write(i[0]+"\t"+str(i[1])+"\n")
if __name__ == '__main__':
grab()
grab_word()