A administração da Previdência Social tem esses dados limpos por ano dos nomes mais populares para bebês nascidos naquele ano nos EUA (ver nomes de bebês da previdência social).
Os arquivos deste exercício estão no diretório "babynames", dentro de google-python-exercises. Faça o download de google-python-exercises.zip, caso ainda não tenha feito isso. Consulte Configurar para ver mais detalhes. Adicione seu código em babynames.py. Os arquivos baby1990.html baby1992.html ... contêm html bruto, semelhante ao que você obtém ao visitar o site da Previdência Social acima. Dê uma olhada no html e pense em como você pode extrair os dados dele.
Parte A
No arquivo babynames.py, implemente a função extract_names(filename), que leva o nome do arquivo baby*.html e retorna os dados do arquivo como uma lista única -- a string do ano no início da lista, seguida pelas strings da classificação do nome em ordem alfabética. ['2006', 'Aaliyah 91', 'Abagail 895', 'Aaron 57', ...]. Modifique main() para que ela chame sua função extract_names() e mostre o que ela retorna (o main já tem o código para análise do argumento de linha de comando). Se você não souber trabalhar nas expressões regulares para o ano e cada nome, os padrões de expressão regular da solução são mostrados no final deste documento. Observe que para analisar páginas da web em geral, as expressões regulares não funcionam bem, mas essas páginas da web têm um formato simples e consistente.
Em vez de tratar os nomes de meninos e meninas separadamente, vamos juntá-los todos. Em alguns anos, um nome aparece mais de uma vez no html, mas usaremos apenas um número por nome. Opcional: torne o algoritmo inteligente para esse caso e escolha o número menor.
Crie o programa como uma série de pequenos marcos, fazendo com que cada etapa execute/imprima algo antes de tentar a próxima. Esse é o padrão usado por programadores experientes: construa uma série de marcos incrementais, cada um com alguns resultados a serem verificados, em vez de construir todo o programa com um grande passo.
Imprimir os dados que você tem no final de um marco ajuda você a pensar em como reestruturar esses dados para o próximo marco. O Python é adequado para esse estilo de desenvolvimento incremental. Por exemplo, primeiro leve-o ao ponto em que ele extrai e exibe o ano e chama sys.exit(0). Confira alguns marcos sugeridos:
- Extraia todo o texto do arquivo e imprima-o
- Encontrar, extrair e imprimir o ano
- Extrair os nomes, classificar e mostrar os números
- Colocar os dados de nomes em um dict e mostrá-lo
- Crie e imprima a lista [year, 'name rank', ... ]
- Correção de main() para usar a lista ExtractNames
Anteriormente, tínhamos funções apenas de imprimir em saída padrão. É mais reutilizável fazer com que a função *retorne* os dados extraídos para que o autor da chamada tenha a opção de imprimi-los ou fazer outra coisa com eles. Você ainda pode imprimir diretamente de dentro das funções para seus pequenos experimentos durante o desenvolvimento.
Faça com que main() chame extract_names() para cada argumento de linha de comando e imprima um resumo de texto. Para transformar a lista em um texto de resumo com aparência razoável, a mesclagem funciona de maneira inteligente: text = '\n'.join(mylist) + '\n'
O texto do resumo deve ficar assim para cada arquivo:
2006 Aaliyah 91 Aaron 57 Abagail 895 Abbey 695 Abbie 650 ...
Parte B
Vamos supor que, em vez de imprimir o texto com saída padrão, queiramos gravar arquivos contendo o texto. Se a flag --summaryfile estiver presente, faça o seguinte: para cada arquivo de entrada "foo.html", em vez de imprimir na saída padrão, escreva um novo arquivo "foo.html.summary" que contém o texto de resumo desse arquivo.
Quando o recurso --summaryfile estiver funcionando, execute o programa em todos os arquivos usando * da seguinte maneira: "./babynames.py --summaryfile baby*.html". Isso gera todos os resumos em uma etapa. O comportamento padrão do shell é expandir o padrão "baby*.html" para a lista de nomes de arquivos correspondentes e, em seguida, executar babynames.py, transmitindo todos esses nomes de arquivos na lista sys.argv.
Com os dados organizados em arquivos de resumo, é possível ver padrões ao longo do tempo com comandos do shell, como este:
$ grep 'Trinity ' *.summary $ grep 'Nick ' *.summary $ grep 'Miguel ' *.summary $ grep 'Emily ' *.summary
Dicas de expressão regular -- year: r'Popularity\sin\s(\d\d\d\d)' nomes: r'<td>(\d+)</td><td>(\w+)</td>\<td>(\w+)</td>'