社會安全行政管理部門提供的這項寶貴資料,是每年在美國出生的嬰兒最受歡迎的年份 (請參閱社會安全寶寶名字)。
本練習的檔案位於 google-python-exercises 的「babynames」目錄中 (如果您尚未下載 google-python-exercises.zip,請參閱「設定」一文瞭解詳情)。在 babynames.py 中新增程式碼。baby1990.html baby1992.html ... 檔案包含原始 HTML,類似於您造訪上述社會安全網站時使用的格式。查看 HTML,想想如何從其中資料抓取資料。
A 部分
在 babynames.py 檔案中,實作 extract_names(filename) 函式,該函式將 baby*.html 檔案的檔案名稱做為單一清單傳回,也就是清單開頭的年份字串,後方為名稱排名字串的字母順序。['2006', 'Aaliyah 91', 'Abagail 895', 'Aaron 57', ...]. 請修改 main(),以便呼叫 extract_names() 函式並輸出傳回的內容 (主已具有指令列引數剖析的程式碼)。如果輸入年份和名稱的規則運算式時遇到問題,本文件結尾會顯示解決方案規則運算式模式。請注意,一般來說,規則運算式的剖析格式可能沒有效果好,但這些網頁的格式簡單且一致。
我們不會分別將男孩和女孩的名字全部化在一起。近年來,每個名稱在 HTML 中出現不只一次,但每個名稱只會使用一個數字。選用:讓演算法更聰明地判斷此情況,並選擇較小數字。
請將程式建構成一系列的小里程碑,然後完成每個步驟來執行/列印某些步驟,然後再嘗試下一個步驟。這是經驗豐富的程式設計人員會採用的模式,也就是建立一系列的漸進式里程碑,每項里程碑都有需要檢查的輸出結果,而非透過單一大幅步驟建構整個程式。
將某個里程碑結束時取得的資料列印出來,有助於您思考如何重新建構下一個里程碑的資料結構。Python 非常適合這種漸進式開發方式。舉例來說,先取得其擷取年份並輸出年份,然後呼叫 sys.exit(0)。以下是建議的里程碑:
- 擷取檔案中的所有文字並列印
- 找出並擷取年份,然後列印出來
- 擷取名稱並進行排名數字
- 將名稱資料取得到字典中並列印
- 建立 [year, 'name rank', ... ] 清單並列印
- 修正 main() 以使用 ExtractNames 清單
我們先前只提供列印至標準輸出的功能。因此,使用該函式「傳回」所擷取的資料會比較容易使用,因此呼叫端可以選擇列印該資料或執行其他操作。(在開發期間,您還是可以直接從函式中列印,以進行小幅實驗)。
為每個指令列引數設定 main() 呼叫 extract_names(),然後輸出文字摘要。為了讓清單變成合理的摘要文字,建議您巧妙運用彙整功能:text = '\n'.join(mylist) + '\n'
每個檔案的摘要文字應如下所示:
2006 Aaliyah 91 Aaron 57 Abagail 895 Abbey 695 Abbie 650 ...
B 部分
假設我們想要撰寫包含文字的檔案,而不是將文字輸出成標準文字。如果含有 --summaryfile 標幟,請執行以下步驟:為每個輸入檔案「foo.html」撰寫內容,不要列印至標準輸出,而是撰寫一個包含該檔案摘要文字的新檔案「foo.html.summary」。
--summaryfile 功能正常運作後,請使用 * 範例,在所有檔案上執行程式,例如:「./babynames.py --summaryfile baby*.html」。只要一個步驟就能產生所有摘要。(殼層的標準行為是將「baby*.html」模式展開為相符檔案名稱清單,然後殼層就會執行 babynames.py,並傳入 sys.argv 清單中的所有檔案名稱)。
資料整理成摘要檔案後,您可以透過殼層指令查看隨時間變化的模式,如下所示:
$ grep 'Trinity ' *.summary $ grep 'Nick ' *.summary $ grep 'Miguel ' *.summary $ grep 'Emily ' *.summary
規則運算式提示 --year: r'Popularity\sin\s(\d\d\d\d)' names: r'<td>(\d+)</td><td>(\w+)</td>\<td>(\w+)</td>'