L'amministrazione della previdenza sociale dispone di questi dati dettagliati per anno relativi ai nomi più popolari per i bambini nati quell'anno negli Stati Uniti (vedi nomi di bambini sulla previdenza sociale).
I file per questo esercizio si trovano in "babynames" all'interno di google-python-exercises (scarica google-python-exercises.zip se non lo hai già fatto, vedi Configurazione per i dettagli). Aggiungi il tuo codice in babynames.py. I file baby1990.html baby1992.html ... contengono codice HTML non elaborato, simile a quello che si ottiene visitando il precedente sito di previdenza sociale. Esamina il codice HTML e pensa a come estrarre i dati.
Parte A
Nel file babynames.py, implementa la funzione estrapola_names(filename) che prende il nome di un file baby*.html e restituisce i dati dal file come un unico elenco, ovvero la stringa dell'anno all'inizio dell'elenco seguita dalle stringhe con ranking dei nomi in ordine alfabetico. ['2006', 'Aaliyah 91', 'Abagail 895', 'Aaron 57', ...]. Modifica main() in modo che chiami la funzione estratti_names() e stampa ciò che restituisce (main ha già il codice per l'analisi dell'argomento della riga di comando). Se non riesci a elaborare le espressioni regolari per l'anno e ciascun nome, alla fine di questo documento vengono mostrati i pattern delle espressioni regolari della soluzione. Tieni presente che per l'analisi di pagine web in generale, le espressioni regolari non sono efficaci, poiché hanno un formato semplice e coerente.
Invece di trattare i nomi del ragazzo e della ragazza separatamente, li accorperemo tutti insieme. In alcuni anni, un nome appare più di una volta nel codice HTML, ma utilizzeremo un solo numero per nome. (Facoltativo) Rendi l'algoritmo più intelligente per questo caso e scegli il numero minore.
Crea il programma come una serie di piccoli traguardi, facendo in modo che ogni passaggio venga eseguito/stampato qualcosa prima di provare il passaggio successivo. Questo è lo schema utilizzato da programmatori esperti: crea una serie di traguardi incrementali, ciascuno con alcuni output da verificare, piuttosto che costruire l'intero programma in un'unica grande fase.
La stampa dei dati a disposizione alla fine di un traguardo ti aiuta a pensare a come riorganizzare i dati per il traguardo successivo. Python è adatto a questo stile di sviluppo incrementale. Ad esempio, portalo innanzitutto al punto in cui estrae e stampa l'anno e chiama sys.exit(0). Ecco alcuni traguardi consigliati:
- Estrai tutto il testo dal file e stampalo
- Trova ed estrai l'anno e stampalo
- Estrai i nomi, i numeri di ranking e stampali
- Recupera i dati dei nomi in un dettato e stampali
- Crea l'elenco [year, 'name Rank', ... ] e stampalo
- Correggi main() per utilizzare l'elenco ExtractNames
In precedenza avevamo funzioni che richiedevano la stampa standard. È più riutilizzabile fare in modo che la funzione *restituisce* i dati estratti, in modo che il chiamante possa scegliere se stamparli o farne uso. Puoi comunque stampare direttamente dalle funzioni per i piccoli esperimenti durante lo sviluppo.
Fai in modo che main() chiami estrapola_names() per ogni argomento della riga di comando e stampa un riepilogo testuale. Per trasformare l'elenco in un testo di riepilogo ragionevole, ecco un uso intelligente del join: text = '\n'.join(mylist) + '\n'
Il testo di riepilogo dovrebbe avere il seguente aspetto per ogni file:
2006 Aaliyah 91 Aaron 57 Abagail 895 Abbey 695 Abbie 650 ...
Parte B
Supponiamo, invece di stampare il testo in modo standard, di voler scrivere file contenenti il testo. Se è presente il flag --summaryfile, procedi nel seguente modo: per ogni file di input "foo.html", invece di stampare su un output standard, scrivi un nuovo file "foo.html.summary" che contiene il testo di riepilogo del file.
Una volta che la funzione --summaryfile funziona, esegui il programma su tutti i file utilizzando * in questo modo: "./babynames.py --summaryfile baby*.html". In questo modo vengono generati tutti i riepiloghi in un solo passaggio. (Il comportamento standard della shell è che espande il pattern "baby*.html" nell'elenco dei nomi file corrispondenti, quindi la shell esegue babynames.py, passando tutti i nomi file nell'elenco sys.argv.
Con i dati organizzati in file di riepilogo, puoi vedere pattern nel tempo con i comandi shell, come questo:
$ grep 'Trinity ' *.summary $ grep 'Nick ' *.summary $ grep 'Miguel ' *.summary $ grep 'Emily ' *.summary
Suggerimenti espressioni regolari -- anno: r' Popolarità\sin\s(\d\d\d\d)' nomi: r'<td>(\d+)</td><td>(\w+)</td>\<td>(\w+)</td>'