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

社会保障局は、その年に米国で生まれた赤ちゃんに最も人気のある名前の年別のデータを提供しています(社会保障の赤ちゃんの名前をご覧ください)。

この演習のファイルは、google-python-exercises 内の「babynames」ディレクトリにあります(まだダウンロードしていない場合は、google-python-exercises.zip をダウンロードします。詳細については、セットアップをご覧ください)。コードを babynames.py に追加します。「Baby1990.html を取得します。」というファイルには、上記の社会保障サイトにアクセスするのと同様の未加工の HTML が含まれています。HTML を確認し、そこからデータをスクレイピングする方法を検討してください。

パート A

babenames.py ファイルで、extract_names(filename) 関数を実装します。これは、baby*.html ファイルのファイル名を取得し、ファイルのデータを単一のリストとして返します。リストの先頭にある年の文字列と、それにアルファベット順の名称ランクの文字列が続く文字列です。['2006', 'Aaliyah 91', 'Abagail 895', 'Aaron 57', ...]. main() を変更して、 extract_names() 関数を呼び出し、その関数が返す内容を出力します(main には、コマンドライン引数を解析するためのコードがすでにあります)。年や各名前の正規表現について苦労した場合のために、このドキュメントの最後に、ソリューションの正規表現パターンを示します。ウェブページの一般的な解析では、正規表現はあまり効果的ではありませんが、これらのウェブページはシンプルで一貫した形式となっています。

ここでは、男の子と女の子の名前を別々に扱うのではなく、すべてを 1 つにまとめます。HTML で名前が複数回出現することもありますが、1 つの名前につき 1 つの数字だけを使用します。任意: このケースについてアルゴリズムがスマートに処理し、小さい方の数値を選択します。

プログラムを小さなマイルストーンとして構築し、各ステップで何かを実行または出力してから、次のステップを試してください。これは経験豊富なプログラマーが使用するパターンです。プログラム全体を 1 つの大きなステップで構築するのではなく、一連の段階的なマイルストーンを構築して、各マイルストーンごとに確認すべき出力があります。

あるマイルストーンの終了時に取得したデータを出力することで、次のマイルストーンに向けてそのデータをどのように再構築するかを考えるのに役立ちます。Python は、このような段階的な開発に適しています。たとえば、まず年を抽出して出力し、sys.exit(0) を呼び出すところまで進みます。推奨されるマイルストーンは次のとおりです。

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

これまでは、関数を標準出力に出力していました。抽出されたデータを返す関数を関数に持たせると、呼び出し元は出力を出力するか、他の処理を行うかを選択できるようになります。(開発中の小規模なテストのために、関数内から直接出力することもできます)。

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 --summaryfilebaby*.html」のようにすべてのファイルでプログラムを実行します。これにより、1 つのステップですべてのサマリーが生成されます。(シェルの標準的な動作では、「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>'