Ejercicio de Python para nombres de bebés

La Administración de Seguridad Social tiene estos datos prolijos por año sobre los nombres más populares entre los bebés que nacieron ese año en EE.UU. (consulta nombres de bebés de seguridad social).

Los archivos de este ejercicio están en el directorio "babynames" dentro de google-python-exercises (descarga google-python-exercises.zip si aún no lo hiciste; consulta Configuración para obtener más detalles). Agrega tu código a babynames.py. Los archivos baby1990.html baby1992.html ... contienen código HTML sin procesar, similar al que se obtiene al visitar el sitio de seguridad social anterior. Echa un vistazo al html y piensa cómo podrías extraer los datos de él.

Parte A

En el archivo babynames.py, implementa la función extract_names(filename) que toma el nombre de un archivo baby*.html y muestra los datos del archivo como una sola lista: la cadena de año al principio de la lista, seguida de las cadenas de rango de nombres en orden alfabético. ['2006', 'Aaliyah 91', 'Abagail 895', 'Aaron 57', ...]. Modifica main() para que llame a tu función extract_names() e imprima lo que muestra (main ya tiene el código para el análisis del argumento de la línea de comandos). Si no puedes resolver las expresiones regulares del año y cada nombre, los patrones de expresiones regulares de solución se muestran al final de este documento. Ten en cuenta que, para analizar páginas web en general, las expresiones regulares no sirven, pero estas páginas web tienen un formato simple y coherente.

En lugar de tratar los nombres de los niños y las niñas por separado, solo los agruparemos. En algunos años, un nombre aparece más de una vez en el código HTML, pero usaremos un número por nombre. Opcional: Haz que el algoritmo sea inteligente para este caso y elige el número que sea menor.

Crea el programa como una serie de pequeños hitos, y asegúrate de que cada paso ejecute o imprima algo antes de intentar el siguiente paso. Este es el patrón que utilizan los programadores experimentados: crea una serie de logros incrementales, cada uno con algún resultado para verificar, en lugar de compilar todo el programa en un paso enorme.

Imprimir los datos que tienes al final de un hito te ayuda a pensar en cómo reestructurar esos datos para el siguiente hito. Python es adecuado para este estilo de desarrollo incremental. Por ejemplo, primero hay que llegar al punto en que extraiga e imprima el año y llame a sys.exit(0). Estos son algunos hitos sugeridos:

  • Extrae todo el texto del archivo y, luego, imprímelo
  • Busca y extrae el año, y, luego, imprímelo
  • Extrae los nombres y los números de clasificación, y, luego, imprímelos
  • Obtén los datos de los nombres en un dict y, luego, imprímelos
  • Crea la lista [año, 'clasificación de nombre', ... ] e imprímela.
  • Corrige main() para usar la lista ExtractNames

Anteriormente, teníamos funciones que se imprimen en resultados estándar. Es más reutilizable que la función *devuelva* los datos extraídos, de modo que el emisor tenga la opción de imprimirlos o hacer algo más con ellos. (Aún puedes imprimir directamente desde las funciones para los pequeños experimentos que realices durante el desarrollo).

Haz que main() llame a extract_names() para cada argumento de línea de comandos e imprima un resumen de texto. Para convertir la lista en un texto de resumen razonable, puedes usar la combinación de forma inteligente: text = '\n'.join(mylist) + '\n'

El texto del resumen debería verse de la siguiente manera para cada archivo:

2006
Aaliyah 91
Aaron 57
Abagail 895
Abbey 695
Abbie 650
...

Parte B

Supongamos que, en lugar de imprimir el texto de forma estándar, queremos escribir archivos que contengan el texto. Si la marca --summaryfile está presente, haz lo siguiente: para cada archivo de entrada “foo.html”, en lugar de imprimir como resultado estándar, escribe un archivo nuevo “foo.html.summary” que contenga el texto de resumen para ese archivo.

Una vez que la función --summaryfile esté funcionando, ejecuta el programa en todos los archivos con *, así: "./babynames.py --summaryfile baby*.html". Esto genera todos los resúmenes en un solo paso. (El comportamiento estándar de la shell es que expande el patrón "baby*.html" a la lista de nombres de archivo coincidentes y, luego, la shell ejecuta babynames.py y pasa todos esos nombres de archivo a la lista sys.argv).

Con los datos organizados en archivos de resumen, puedes ver patrones a lo largo del tiempo con comandos de shell, como los siguientes:

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

Sugerencias de expresiones regulares -- year: r'Popularity\sin\s(\d\d\d\d)' names: r'<td>(\d+)</td><td>(\w+)</td>\<td>(\w+)</td>"