Ejercicio de Python para nombres de bebés

La administración de seguridad social posee estos datos detallados por año sobre los nombres más populares para los bebés nacidos ese año en los EE.UU. (consulta nombres de bebés en la seguridad social).

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

Parte A

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

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

Crea el programa como una serie de pequeños hitos, haciendo que cada paso se ejecute o imprima algo antes de intentar el siguiente. Este es el patrón que usan los programadores experimentados: crea una serie de hitos incrementales, cada uno con algunos resultados que verificar, en lugar de crear todo el programa en un gran paso.

Imprimir los datos que tienes al final de un hito te ayuda a pensar en cómo reestructurar esos datos para el próximo hito. Python se adapta bien a este estilo de desarrollo incremental. Por ejemplo, primero llévalo al punto en el que extrae e imprime el año y llama a sys.exit(0). Estos son algunos hitos sugeridos:

  • Extrae todo el texto del archivo y, luego, imprímelo.
  • Busca, 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 nombres en un dict y, luego, imprímelo
  • Crea la lista de [año, 'clasificación de nombre', ... ] e imprímela
  • Se corrigió main() para usar la lista ExtractNames.

Anteriormente, teníamos funciones que solo imprimían en salidas estándar. Es más reutilizable que la función *devuelva* los datos extraídos, por lo que el llamador tiene la opción de imprimirlos o hacer algo más con ellos. (De todas formas, puedes imprimir directamente desde las funciones para los experimentos pequeños 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, aquí tienes un uso inteligente de la cláusula Join: text = '\n'.join(mylist) + '\n'.

El texto de resumen debe 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 para salida 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 nuevo archivo 'foo.html.summary'. que contiene el texto de resumen de ese archivo.

Una vez que la función --summaryfile funcione, ejecuta el programa en todos los archivos usando * como se muestra a continuación: "./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, pasando todos esos nombres de archivo de la lista sys.argv).

Con los datos organizados en archivos de resumen, puedes ver patrones en el tiempo con comandos de shell, como este:

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

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