赤ちゃんの名前の Python の練習

社会保障局は、米国でその年に生まれた新生児に最も人気のある名前を、その年ごとにわかりやすくまとめています( 社会保障制の新生児の名前など)。

この演習用のファイルは、babynames、google-python-exercises ディレクトリ内にあります(まだ google-python-exercises.zip をダウンロードします。詳細については、設定をご覧ください)。コードを babynames.py に追加します。baby1990.html baby1992.html ... ファイルには、上記の社会保障サイトにアクセスするのと同じように、未加工の html が含まれています。html を見て、どのようにデータをスクレイピングできるか考えてください。

パート A

babynames.py ファイルで extract_names(filename) 関数を実装します。この関数は、baby*.html ファイルのファイル名を受け取り、ファイルからのデータを 1 つのリストとして返します。リストの先頭の年の文字列の後に、アルファベット順の名前ランクの文字列が続きます。['2006', 'Aaliyah 91', 'Abagail 895', 'Aaron 57', ...]。extract_names() 関数を呼び出して戻り値を出力するように main() を変更します(main にはコマンドライン引数を解析するためのコードがすでに存在します)。年とそれぞれの名前の正規表現がわからなければ、このドキュメントの最後に解答の正規表現パターンを示します。一般的に、ウェブページの解析では正規表現は適切に機能しませんが、これらのウェブページはシンプルで一貫した形式です。

男の子と女の子の名前を別々に扱うのではなく、すべてひとまとめにします。名前が html で複数回出現することもありますが、名前ごとに 1 つの数字のみを使用します。省略可: この場合、アルゴリズムをスマートにし、小さいほうの数値を選択します。

小さなマイルストーンの連続としてプログラムを構築し、各ステップで何かを実行/印刷してから、次のステップに進みます。これは、経験豊富なプログラマーが使用するパターンです。プログラム全体を 1 つの大きなステップで構築するのではなく、一連の増分マイルストーンを構築し、それぞれにチェックする出力を生成します。

1 つのマイルストーンの終わりに取得したデータを出力しておくと、次のマイルストーンのためにそのデータを再構築する方法を考えることができます。Python はこうしたスタイルの増分開発に適しています。たとえば、まず年を抽出して出力し、sys.exit(0) を呼び出すところまで進みます。マイルストーンの推奨事項をいくつか紹介します。

  • ファイルからすべてのテキストを抽出して出力する
  • 年を検索して抽出し、印刷する
  • 名前とランク番号を抽出して出力する
  • 名前データをディクショナリに取得して出力する
  • [year, 'name rank', ... ] リストを作成して出力する
  • ExtractNames リストを使用するように main() を修正

以前は、標準出力に出力するだけの関数がありました。抽出したデータを関数に *返す* 方が再利用性が高く、呼び出し元はそのデータを出力するか、別の処理を行うかを選択できます。(開発中の小さなテストのために、関数内から直接出力することもできます)。

main() でコマンドライン引数ごとに extract_names() を呼び出して、テキストの概要を出力します。リストを合理的な概要テキストにするために、JOIN をうまく活用しましょう: 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」)。これにより、すべての要約が 1 つのステップで生成されます。(シェルの標準的な動作では、「baby*.html」パターンを一致するファイル名のリストに展開してから、babynames.py が実行され、すべてのファイル名が sys.argv リストに渡されます)。

データをサマリー ファイルに整理すると、次のようなシェルコマンドで時間の経過に伴うパターンを確認できます。

$ grep 'Trinity ' *.summary
$ grep 'Nick ' *.summary
$ grep 'Miguel ' *.summary
$ grep 'Emily ' *.summary

正規表現のヒント -- 年: r'Popularity\sin\s(\d\d\d\d)'name: r'<td>(\d+)</td><td>(\w+)</td>\<td>(\w+)</td>'