請完成一個程序,並能按步驟實現以下功能:
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()