Operations Director Steve Pitchford tutoring two members of the team at Majestic.

Imparare Python per fare SEO – Parte Seconda

Nella prima parte di questa guida sono stati illustrati alcuni concetti fondamentali per di programmazione. In questa sezione cominciamo a “sporcarci le mani” con del codice per programmare in Python!

Val la pena fare un breve riepilogo degli argomenti trattati nella prima parte di questa guida per aspiranti programmatori Python per il SEO. Molti concetti torneranno utili nelle prossime pagine. Svilupperemo approfondimenti che fanno riferimento a variabili, loop, processi decisionali e la capacità di definire funzioni – tutti argomenti affrontati nella sezione precedente. Python presenta somiglianze e differenze dal pseudocodice di cui abbiamo discusso nella sezione precedente. L’intenzione è quella di avvicinare quest’ultimo a Python come linguaggio di programmazione.

A questo punto, alcune guide ti suggeriranno di scaricare il Python. Noi faremo una cosa diversa.

Imparare un nuovo linguaggio di programmazione può rivelarsi molto difficile e per questo abbiamo pensato di evitare complicazioni e difficoltà iniziali che non sono indispensabili – in particolare l’installazione di Python. In questo modo puoi concentrarti sulle cose più importanti che sono, appunto il linguaggio stesso.

Con questa premessa, noi ti incoraggiamo all’uso di una soluzione web per utilizzare e scrivere codice in Python – quindi non c’è bisogno di installare software.

Interpreti Python “web based”

Python è eseguibile da Microsoft Windows, Mac, e Linux ed è disponibile anche in Cloud. Esiste anche una versione di Python che si chiama micro python (https://micropython.org/) creata per l’utilizzo su apparecchiature piccole “embedded”.

Questa offerta così diversificata di Python può creare una inutile perdita di tempo – almeno in una prima fase di studio. Vogliamo evitarti questa esperienza che, per molti, potrebbe essere negativa.

Esistono alcuni interpreti web per Python – ne abbiamo individuati due che si possono utilizzare per sviluppare le attività proposte in questa guida che sono repl.it e onlinegdb.com. Entrambi gli ambienti di lavoro si ispirano agli stessi principi ma con piccole differenze di layout.

Entrambi gli ambienti sono stati esaminati da noi. Riportiamo qui di seguito le nostre considerazioni che troverai utili per decidere quale ambiente di produzione più adatto alle tue abitudini di lavoro – oppure quale dei due ti piace di più!

Repl.it

 Repl.it lavora con diversi linguaggi e una funzionalità di condivisione con altre persone. Questa funzionalità viene ad un piccolo costo!

Una volta attivato Repl.it e fatto l’accesso, l’ambiente di lavoro si presente suddivisio in tre pannelli. Se deciderai di utilizzare Repl.it con questo tutorial di Python ti troverai ad utilizzare i pannelli centrale e di destra. La finestra centrale è la nostra interfaccia dove viene inserito il codice Python e sulla destra il codice viene eseguito.

Repl.it – le tre finestre di un tipico ambiente di lavoro con l’interprete Python

Per avviare una sessione di lavoro con Python:

  1. collegati al sito Repl.it
  2. Scegli Python
  3. Clicca su Create new (crea nuovo)”
  4. Evita Repl setup

Scegli “new repl”  
Ad oggi, il tasto per creare la nuova istanza di Repl è situato in alto a destra sullo schermo. Non c’è bisogno di registrarsi e fare un login per attivare una sessione di lavoro con Python.

Repl.it – attivazione di un nuovo ambiente di programmazione

Scegli Python

Adesso ti verrà data l’opzione di creare un Repl nuovo oppure importante uno già esistente. Repl.it presenta inoltre una lista di linguaggi tra cui scegliere. Per questo tutorial scegli “Python” dall’opzione “Create New Repl”.

Repl.it – Come creare un nuovo ambiente di lavoro in Python

Adesso bisogna confermare la creazione di una nuova sessione di Python con Repl. Per attivarla clicca sul tasto verde “Create Repl“.

Evitare il setup

Repl.it offre la possibilità di dare un nome e una descrizione alla sessione. Per adesso non te ne devi occupare! Per i nostri usi e obiettivi di questo tutorial non c’è bisogno e puoi evitare cliccando ovunque al di fuori della finestra popup che il sistema ti propone.

Repl.it – La sessione di lavoro per programmare in Python è pronta!

La fase iniziale di configurazione è così terminata, anche se una vera e propria configurazione non l’abbiamo fatta!

OnlineGDB.com

Per sviluppare tutte le attività di programmazione proposte da questa guida, avrai bisogno delle funzionalità più avanzate di Repl.it. Tuttavia, se le attività richieste per lavorare con Repl.it ti sono sembrate complesse, forse hai bisogno di partire con qualcosa di più semplice.

OnlineGDB.com è più facile da utilizzare rispetto a Repl.it. Per avviare OnlineGDB.com c’è solo da visitare questa pagina:

https://www.onlinegdb.com/online_python_debugger

Attenzione: Se scegli di operare con OnlineGDB.com potresti trovarti nella situazione di dover ricorrere all’uso di Repl.it quando dovrai programmare in Python per eseguire gli script più complessi.

OnlineGDB.com si attiva eseguendo un programma esemplificativo “Hello World” che può essere eseguito cliccando sul tasto “esegui” (“Run”). Noterai altresì, che su OnlineGDB.com sono presenti dei banner pubblicitari.

Dal Pseudocodice al Codice Python

Nella prima parte di questo tutorial abbiamo spiegato che cos’è lo pseudocodice, ovvero il tentativo di comunicare algoritmi in un linguaggio strutturato di nostra preferenza.

I linguaggi di programmazione sono molto simili allo pseudocodice ampiamente discusso nella prima parte di questa guida/tutorial, ma con una distinzione molto importante. Nello pseudocodice esprimiamo ogni passo utilizzando un linguaggio di nostra scelta.

Se vuoi programmare in Python, devi seguire le regole definite da Python.

I linguaggi di programmazione definiscono regole per l’assegnazione di nomi alle variabili, offrendo una serie di “comandi” utilizzati per spiegare al computer cosa deve fare passo-passo nella esecuzione del programma.

L’ultima volta che abbiamo esaminato uno pseudocodice è stato per chiedere il nome di un utente e salutarlo:

Pseudocode to greet a user
Show Message “What is your name?”
name = Input
Show Message “Hello {name}” 

Il linguaggio di programmazione Python è concettualmente simile allo pseudocodice precedente ma differisce nell’implementazione. Cominciamo la nostra scoperta del Python esaminando con un po’ di distacco il codice del paragrafo precedente e prediamo in esame il problema noto come “Hello World” il primo programma che s’incontra spesso nelle guide per imparare a programmare. Il programma stampa il messaggio “Hello World” a schermo. In Python si esprime come segue:

print (“Hello World”)

Analizziamo in dettaglio questo breve programma per capire struttura e punteggiatura:

Analisi della struttura e sintassi della istruzione print("Hello World") in Python
Analisi della struttura e sintassi dell’istruzione print(“Hello World”) in Python
  • Print
    Il comando “print” – fare attenzione all’uso disinvolto di minuscole o maiuscole – Print oppure PrinT o prinT non sono comandi riconosciuti da  Python e daranno un errore.
  • Le parentesi tonde (…)
    Sono molto importanti. Il comando “print” è una funzione nativa di Python. Nel Python, le funzioni utilizzano spesso le parentesi che contengono i parametri della funzione. In questo caso, l’uso della funzione print ha un solo parametro – il messaggio che vogliamo che venga mostrato all’utente.
  • “Hello World”
    È il parametro che viene passato alla funzione. Le virgolette si utilizzano per indicare che il messaggio è una stringa. Se non ci fossero state le virgolette, Python potrebbe ritenere che “hello” oppure “World” sono delle variabili o funzioni e questo causerebbe un errore.

Questo comando è costituito da tre elementi:

  1. La parola print – un comando riconosciuto da Python
  2. Abbiamo poi le parentesi tonde di contenimento…
  3.  La frase “Hello World” – alcuni caratteri contenuti all’interno di virgolette.

È importante sapere che molti linguaggi di programmazione sono “case-sensitive” ovvero distinguono tra lettere maiuscole e minuscole. L’essere case-sensitive implica che Print e print si riferiscono a cose diverse. Quindi dare il comando Print per inviare un messaggio con Python risulterà in un errore – provare per credere!

La frase “Hello World” è detta stringa – una sequenza di caratteri testuali limitata dall’uso delle virgolette. Entro limiti ragionevoli, questa stringa può essere modificata per trasmettere messaggi di ogni tipo – ad esempio “Hello Bob”, “Hello Sue”, oppure “Buon giorno Sig. Presidente”, con impatto minimo (per non dire nullo) sul resto del programma.

Adesso possiamo utilizzare questa informazione con uno dei due interpreti per Python che sono stati esaminati in questa sezione della guida (Repl.it e OnlineGDB.com). È opportuno dare qualche altra informazioni su Python a benefico e vantaggio di chi non ne sa nulla. Come per tutti i linguaggi di programmazione, Python si è evoluto nel tempo: con l’aumentare dell’esperienza e della condivisione di idee su come sviluppare il linguaggio, anche Python si è evoluto di versione in versione e capita spesso confrontarsi online con diverse versioni di Python, anche negli ambienti di produzione come quelli appena menzionati. Infatti, alcuni potrebbero utilizzare una versione più vecchia di Python chiamata Python 2. In questa guida all’uso di Python per SEO facciamo riferimento alla versione più nuova oggi disponibile – il Python 3.

Considerazioni sulle versioni di Python

La programmazione di computer è un lavoro complesso. Molti potrebbero cadere nella trappola del luogo comune secondo cui persone capaci di scrivere un linguaggio di programmazione sono dei geni infallibili che non commettono errori.

Può rassicurare sapere che così non è: sono delle persone normali con pregi e difetti e limiti come tutti noi. Chi scrive un linguaggio di programmazione impara e si evolve come noi. Anche lo sviluppo di un linguaggio di programmazione è un’abilità che si sviluppa facendo pratica, scoprendo nuovi modi per fare cose intelligenti e migliorare cose esistenti.

Questo processo di miglioramento ha come conseguenza l’aggiornamento del linguaggio con l’aggiunta di nuove funzionalità. A volte i linguaggi di programmazione subiscono trasformazioni tali da renderli incoerenti. Questa incoerenza può avere un impatto sulle performance, rallentando l’esercizio della programmazione. I gestori del linguaggio, alla luce di questo processo evolutivo, possono decidere di rilasciare una nuova versione del linguaggio per eliminare le incongruenze venutesi a creare con il tempo: questo può avere un impatto sui programmi vecchi.

L’introduzione di modifiche che possono compromettere il funzionamento di software non è una pratica raccomandabile. SE un linguaggio di programmazione richiede interventi a questo livello, si tende a sdoppiare il linguaggio in due. La versione vecchia garantisce il funzionamento a programmi vecchi. Così facendo si spera che gli utenti, con l’andar del tempo, sviluppino software utilizzando la nuova versione che diventa così il nuovo standard per la creazione di software.

Il Python 2 è stato un linguaggio di programmazione molto utilizzato che ha visto molti aggiornamenti. Tuttavia, così come abbiamo descritto in questo paragrafo, è giunto il momento di passare ad una nuova versione – il Python 3 che ha lo stesso approccio di fondo alla programmazione con dei distinguo importanti che di fatto compromettono il funzionamento di software scritto per il Python 2. Tutto questo per offrire un linguaggio di programmazione al passo con i tempi, in linea con lo sviluppo della tecnologia e delle esigenze di una programmazione moderna e più efficiente.

Oggi lo standard a cui facciamo riferimento, quando si parla di Python, è il Python 3. Ogni riferimento a Python in questa guida deve essere inteso come Python 3.

Val la pena ricordare che negli anni lo sviluppo di Python 2 e Python 3 ha visto l’introduzione di modifiche per correggere errori ed implementare nuove funzionalità. Quando facciamo riferimento a Python 3, stiamo parlando di una serie di versioni del linguaggio a partire dalla versione 3.0.1 per arrivare alla più recente 3.8.1 (l’ultima alla data di creazione di questa guida).

Per avere ulteriori informazioni sulla storia del Python e scoprire tutte le versioni disponibili, collegati alla pagine python releases e quella di Wikipedia Storia del Python (Articolo su Wikipedia disponibile solo in lingua inglese).

Il nostro primo programma in Python

Abbiamo già visto un primo programma – “Hello World”. Facciamo girare il programma utilizzando uno degli interpreti Python esaminati!

Se hai deciso per il Repl.it puoi inserire il programma nella finestra principale contrassegnata con il numero 1 nell’immagine che segue:

Esecuzione del programma "Hello World" con Repl.it
Esecuzione del programma “Hello World” con Repl.it

Inserito il programma print(“Hello World”) nella finestra principale, può essere eseguito cliccando sul tasto verde “Run” (2). Se tutto procede come da piani, dovrebbe apparire nella finestra di destra il messaggio “Hello World”. Se invece hai optato per OnlineGDB.com anziché Repl.it, il programma “Hello World” è già presente. Per mandarlo in esecuzione basta cliccare, anche qui, sul tasto verde dov’è scritto “Run” nel menu principale (vedi immagine che segue).

OnlineGDB.com: mandare in esecuzione il programma "Hello World" con Python
OnlineGDB.com: mandare in esecuzione il programma “Hello World” con Python

Quando si clicca sul tasto, la finestra si modifica leggermente ed appare un nuovo pannello in basso sullo schermo.

OnlineGDB.com: appare una nuova finestra quando si esegue un programma in Python
OnlineGDB.com: appare una nuova finestra quando si esegue un programma in Python

È qui, in questa nuova finestra che dovresti vedere il messaggio “Hello World”, accompagnato da un messaggio con informazioni di natura tecnica. Se nella tua finestra appare lo stesso messaggio che puoi vedere nella screenshot precedente ha funzionato tutto – complimenti!

E se il programma non funziona?

Molte delle guide che abbiamo esaminato danno per scontato il fatto che questo primo programma non può che funzionare a primo colpo e passano avanti ad esaminare altri aspetti della programmazione con Python. Ma se per caso non dovesse funzionare? Se il sistema ci restituisce un messaggio di errore lamentandosi del fatto che non è stato possibile eseguire il programma che bisogna fare?

Anche se il programma ha funzionato (come ti auguriamo), queste domande offrono lo spunto per fare delle considerazioni vista la quantità di tempo che programmatori passano a fare il “debugging”. Alla luce di queste considerazioni simuliamo alcune situazioni che si possono presentare a chi si avvicina alla programmazione in Python per la prima volta. Problemi di case sensitivity: hai usato una maiuscola al posto della minuscola.

 Print("Hello World")
Traceback (most recent call last):
    File "main.py", line 1, in 
    Print("Hello World")
  NameError: name 'Print' is not defined

È possibile che il sistema restituisca il messaggio:

 name 'Print' is not defined 

e questo messaggio viene restituito dal sistema anche in quei casi in cui il comando print non è scritto correttamente oppure è stato utilizzata una maiuscola da qualche parte. Abbiamo detto che il Python è case sensitive ovvero distingue tra maiuscole e minuscole.

Uso inappropriato di virgolette

Print (hello world)

Traceback (most recent call last):
  File "main.py", line 1
      Print (“hello world”)
                  ^
  SyntaxError: invalid character in identifier

Questo errore è più difficile da intercettare. Le virgolette ammesse ed utilizzate da Python, e da molti altri linguaggi di programmazione, sono diverse da quelle di Microsoft Word. Questo errore si verifica quando si copia da word e s’incolla in un programma.

La mancanza di virgolette

print (hello world)
File "main.py", line 1
      print (hello world)
                   ^
  SyntaxError: invalid syntax

I messaggi di errore sono sempre una cattiva notizia per chi programma, soprattutto quando Python si confonde e indirizza la nostra attenzione puntando in una direzione sbagliata come in questo caso!

Una variazione dell’errore di mancanza di virgolette

print (hello)
Traceback (most recent call last):
    File "main.py", line 1, in 
      print (hello)
  NameError: name 'hello' is not defined 

In questo caso l’errore è duplice: è stato introdotto uno spazio tra il comando print e (hello) e poi mancano le virgolette intorno a hello. Python. Si aspetta una variabile per poter eseguire il comando di stampa e non la trova (c’è uno spazio bianco). Python avvisa non appena scopre degli errori – appena li scopre vengono segnalati. Per questo nell’esempio precedente Python si sofferma sulla parola world: è una questione di priorità che viene data agli errori individuati. In questo caso Python, non avendo rilevato virgolette, assume che hello è una variabile e si comporta di conseguenza fermandosi lì.

Acquisire Dati dell’Utente

Riprendiamo ancora il pseudocodice della prima parte della guida:

Show Message “What is your name?”
name = Input
Show Message “Hello {name}” 

Forse hai già intuito che puoi adattare il programma “Hello World” per scrivere in Python la prima riga per inviare a video la domanda:

Print("What is your name?")

Il commando print può essere utilizzato per produrre messaggi per comunicare qualsiasi cosa – si tratta di una stringa (in programmazione, un messaggio si chiama stringa) e quindi la possiamo adattare alle nostre esigenze e formulare una domanda (appunto “What is your name?”)

Le prime due righe dello pseudocodice possono essere sintetizzate in una singola riga di Python (prova ad eseguire in Repl.it oppure OnlineGDB.com – puoi cancellare il codice esistente oppure aggiungere questo alla fine:

name = input("What is your name? ")

Si possono ancora vedere delle somiglianze tra il codice Python ed il pseudocodice. È stata introdotta una variabile name e all’utente è stato inviato il messaggio “What is your name?”. Il comando input assegnerà il valore alla variabile name utilizzando “l’operatore dell’assegnazione” che in termini di programmazione equivale al simbolo: =

Quest’operatore di assegnazione lavora tentando di calcolare ciò che è alla sua destra. Una volta effettuato il calcolo, tenta di assegnare il risultato del calcolo alla variabile che si trova alla sinistra dell’operatore.

Se hai optato per l’inserimento della riga

name = input("What is your name? ")

nell’interprete online che stai utilizzando, avrai notato che non succede molto per stampare il nome. Per fare questo dobbiamo introdurre una variazione al comando print che ci permette l’inserimento di variabili in una stringa:

print ("Hello {}".format(name))

Inserendo entrambi le righe di codice su Repl.it o OnlineGDB.com nell’ordine riportato puoi provare il programma e puoi aspettarti di essere salutato con un tocco personale dal computer:

name = input("What is your name? ") 
print ("Hello {}".format(name))

Torneremo a parlare della stringa “Hello {}”.format(name) più in avanti parlando di metodi. Ma prima dobbiamo affrontare il tema della creazione di funzioni.

Le Funzioni

Una delle funzionalità di cui si è parlato nella prima sezione della guida è stata la creazione di funzioni – modalità per conferire una struttura migliore ad un programma riducendo la quantità di codice richiesto per svolgere un’attività.

Dal momento che le funzioni sono una cosa così comune in tutt’i linguaggi, Python le rende estremamente facili da definire:

def greet(greetee):
  print("Hello {}".format(greetee))

greet("Bob")
greet("Sue")
greet("World")

Inserendo questo codice nel tuo interprete Python dovresti vedere il seguente output:

Hello Bob
Hello Sue
Hello World

Val la pena sottolineare che la chiamata alla funzione greet a cui vengono passati i parametri somiglia molto al comando print. I comandi Python possono essere pensati come delle funzioni native del linguaggio di programmazione.

Per creare una funzione si utilizza il comando def seguito dal nome da attribuire alla funzione che si sta definendo (in questo caso greet). La tua funzione può utilizzare uno o più parametri, i cui nomi sono riportati nelle parentesi graffe:

def greet_chef(forename,surname):
  print("Hello Chef {} {}".format(forename,surname))

greet_chef("Huan","Cook")

Dopo I parametri della funzione troviamo “:” la presenza dei due punti indica l’inizio della definizione della funzione – i comandi verranno invocati quando è invocata la funzione.

Nel Python la definizione della funzione presente il rientro di margine tramite tab o spazi. Questo aspetto distingue Python da molti altri linguaggi – si potrebbe considerare come una miglioria dal momento che programmatori tendono a sviluppare blocchi di codice in questo modo. La definizione di funzione può prevedere molti comandi. Per terminare la funzione è sufficiente scrivere di nuovo il codice senza il rientro di margine. Puoi provare una funzione multi-linea, aggiundeo altre due righe di codice:

def greet(greetee):
  print("--------------------------")
  print("Hello {}".format(greetee))
  print("--------------------------")
greet("Bob")
greet("Sue")
greet("World")

Eseguendo questo codice vedrai un output a schermo più articolato con la presenza di righe sopra e sotto attorno al saluto.

Le Decisioni (l’uso di “IF”)

Nella programmazione s’incontra spesso la necessità di dover controllare il flusso delle attività e il trattamento delle informazioni in base al verificarsi di circostanze, facendo delle verifiche per controllare il verificarsi di condizioni predefinite. In Python ci sono molti test che si possono utilizzare – ad esempio il confronto tra numeri per controllare se sono uguali oppure diversi, oppure il confronto tra due stringhe per verificare se sono identiche oppure se una è parte dell’altra. Potresti avere l’esigenza di confrontare due date e verificare se corrispondono allo stesso giorno della settimana.

In ultima analisi, questi test si riducono ad un semplice test di vero o falso.

Verifiche con If permettono al programmatore di poter sviluppare sequenze di controllo anche complesse il cui output è vero oppure falso. Se la condizione è true allora il blocco di codice che segue la condizione logica If viene eseguito. Se invece la condizione logica è false, il blocco di codice non viene eseguito.

Consideriamo l’esecuzione di questo codice a titolo di esempio – riesci ad intuire cosa succederà quando andrà in esecuzione?

test = 7 
if ( test > 6 ):
   print ("The test number ( {} ) is greater than 6".format(test))

Dovresti vederti confermare che 7 è maggiore di 6! C’è una opzione alternativa di default a cui possiamo affidarci utilizzando il comando else utilizzato insieme a if che puoi provare come riportato qui di seguito:

test = 5 
if ( test > 6 ):
   print ("test is greater than 6")
else:
   print ("test is not greater than 6")

Possiamo eseguire delle verifiche e fare test su molte cose, non solo sui numeri. Ad esempio possiamo controllare anche stringhe. Una verifica molto comune è la comparazione di una stringa per stabilire se corrisponde ad un valore predeterminato:

test = "plant" 
if ( test == "fish" ):
   print ("test is a fish")
else:
   print ("test is not a fish")

Da notare che la verifica di confronto tra stringhe o numeri è affidata all’operatore ==. Perché il doppio segno di uguale? Perché = è stato già assegnato da Python.

Python offre moltissimi test nativi che si possono utilizzare su diverse tipologie di dati (data types). Finora abbiamo visto numeri e stringhe. Ma c’è un’altra tipologia di data type – le liste. Queste danno la possibilità di gestire degli elenchi di stringhe con Python:

names = ["bob","sue","rita","world"]

Una verifica utile che si può fare con le liste si effettua con in per verificare la presenza di una particolare stringa nella lista – come nel caso di questa simulazione di controllo di sicurezza nel codice che segue che puoi provare inserendo nel tuo interprete Python:

names = ["bob","sue","rita","world"]

if ( "ralph" in names ):
   print ("ralph can come in")
else:
   print ("ralph cannot come in")

if ( "bob" in names ):
   print ("bob can come in")
else:
   print ("bob cannot come in")

Ci sono molti altri casi dov’è possibile utilizzare i loop con Python, con numerosi esempi disponibili e che si possono consultare su Google. Per adesso andiamo avanti per presentare un nuovo argomento: come far eseguire lo stesso codice molte volte.

Loop e Ripetizione

È possibile esprimere dei loop con Python in diversi modi – molti somigliano alla definizione di una funzione, iniziando con il comando for e che terminano con i due punti.

Nel loop, ad ogni iterazione, ci potrebbero essere delle variabili che si modificano. La variabile si può utilizzare per effettuare una verifica e stabilire se il loop deve continuare, fermarsi oppure fare una semplice conta di numeri.

Una tecnica per contare numeri sfrutta il comando range di Python. Questo produce un insieme di numeri che vengono utilizzati passo-passo- ma bisogna fare attenzione! C’è una trappola in cui cadono tutti gli utenti che si avvicinano a Python per la prima volta. Infatti se fai eseguire nel tuo interprete di Python questo codice potresti rimanere sorpresa dal risultato!

for counter in range(10):
   print(counter)

Questo codice produce:

0
1
2
3
4
5
6
7
8
9

Sono prodotti dieci numeri – zero fino a nove compreso – ma manca il dieci. E questo succede con Python e altri linguaggi di programmazione perché trattano le sequenze di numeri con inizio dallo zero. Questo porta alla situazione strana dove lo zero è il primo elemento, uno è il secondo e così via.

Se vuoi che la sequenza abbia inizio con il numero uno, ci sono un paio di tecniche che possono venire in aiuto. La tecnica più semplice ed immediata è l’aggiunta di uno al contatore prima della stampa della lista:

for counter in range(10) :
   print(counter+1)

Questo codice produce:

1
2
3
4
5
6
7
8
9
10

La seconda tipologia di loop si chiama while loop e continua fino a quando una variabile si modifica facendo verificare una certa condizione prestabilita. Questa tipologia di loop è ideale per fare delle verifiche su dati inseriti da un operatore, come nell’esempio che segue:

name = ""
while ( name != "Rumplestiltskin" ):
  print("Guess my name, Guess my name!")
  name = input()

print ("Well done, you guessed my name!") 

Prova questa sequenza: il codice è un gioco molto semplice in cui l’utente deve indovinare il nome di un personaggio misterioso. Dura fino a quando l’utente non indovina: per fermare il gioco senza conoscere il nome del personaggio misterioso (“Rumplestiltskin”) si deve cliccare su STOP nell’interprete Python. Puoi modificare il gioco cambiando il nome oppure personalizzando il parametro per l’input nel comando print.

Il gioco funziona correttamente perché quando l’utente indovina il nome, si esce dal loop perché la condizione di while cambia, diventando non vera. L’interprete si sposta quindi alla riga successiva di codice e mostra il messaggio che conferma la risposta esatta complimentando l’utente.

Il formato dei blocchi di istruzioni che costituiscono if, for, e while sono simili. Questa consistenza aiuta il programmatore ad adattarsi al linguaggio per esprimere problemi in modo chiaro e veloce.

Abbiamo esaminato una notevole quantità di informazioni fin qui in questa sezione: funzioni, loop condizioni logiche e varie condizioni logiche di verifica che si possono applicare non solo a numeri ma anche alle stringhe e perfino alle liste. Facciamo un riepilogo prima di passare alla spiegazione di

"Hello {}".format("world")

Già promessa all’inizio di questa sezione della guida.

Sommario dei comandi e test

Complimenti! Arrivare fin qui è un bel traguardo. Fermiamoci per qualche minuto per fare il punto su tutte le cose dette in questa sezione della nostra guida che, ricordiamo, è per i SEO a cui interessa imparare Python.

Fin qui abbiamo visto:

·  print("Some Message") mostra un messaggio

·  var = input() cattura del testo inserito dall’utente e lo memorizza nella variabile var

·  var = input("enter some input:") come sopra, ma mostra un messaggio all’utente

·  print("A {} is inserted into this message".format("string")) inserisce una variabile in un messaggio che viene mostrata all’utente.

·  if ( x > 6 ): Se la variabile x è maggiore di 6, esegui il blocco di codice che segue i due punti.

·  else: segue l’istruzione if.

·  posessions = ["house","car","shed"] una lista contenente tre stringhe

·  for i in range(5): Esegue il blocco di codice che segue 5 volte, contando i da 0 a 4

·  while ( name != "Rumplestiltskin" ): Esegue il blocco di codice che segue fino a quando la variabile name contiene la stringa “Rumplestiltskin”

·  name = "bob" assegnazione (assegna alla variabile name la stringa “bob” )

·  name == "bob" Verifica di eguaglianza (effettua il test mettendo a confronto la variabile name e la stringa bob)

·  "boat" in posessions verifica la presenza della stringa “boat”  nella lista posessions Se ancora non ti sei fermata, questo è il momento di concederti una pausa e fissare i concetti illustrati fin qui prima di passare all’ultimo argomento di questa sezione della guida che sono i metodi. Per terminare ci saranno degli esempi di codice Python da cui riprenderemo nella sezione che segue.

Metodi in Python

Il primo esempio di codice scritto per Python è stato “Hello World”. Lì abbiamo utilizzato una nuova form di funzione che abbiamo presentato come metodo. Abbiamo utilizzato il metodo format su una stringa per integrare il dato inserito dall’utente nei messaggi apparsi a schermo. Il codice di cui stiamo parlando è:

"Hello {}".format("world")

Lo puoi eseguire di nuovo nel tuo interprete inserendo il codice che segue:

print( "Hello {}".format("world") )

 Abbiamo parlato della funzione print ma poi abbiamo detto che format è un metodo. Allora qual è la differenza tra funzione e metodo? E perché in un linguaggio di programmazione c’è bisogno di fare la stessa cosa in due modi diversi?

Un modo per capire la differenza tra metodi e funzioni è assimilare i metodi a delle funzioni particolari che fanno delle cose. In questo caso il metodo format è chiamato ad operare sulla stringa

"Hello {}". format( ... )

Il punto tra

"Hello {}"

e

format ( ... )

è il simbolo in Python che significa “chiama il seguente metodo ad operare su questa stringa)

quando il codice

"Hello {}".format("world")

Viene eseguito, il computer chiama il metodo format ad operare sulla stringa “Hello {}” prima che venga eseguita l’istruzione print. Quindi in questo caso il metodo format legge la prima stringa e produce una nuova stringa contenente quella vecchia nelle parentesi graffe {} sostituita con l’argomento elaborato da format. La nuova stringa viene passata alla funzione print() per ottenere la stampa nel formato desiderato.

Per curiosità, prova a togliere il metodo format. Visto cosa succede? In assenza del metodo, Python non interpreta correttamente la stringa. Vede le graffe e le manda a stampa. Il risultato finale è quindi che il programma non stampa la stringa inserita dall’utente, ma:

Hello {}

Quasi sempre i metodi che vengono chiamati dipendono dal contesto in cui vengono chiamati. Puoi chiamare metodi su stringhe ma s’incontrano difficoltà quando s’invoca il metodo format lì dove non è previsto – come ad esempio per i numeri. Vediamo che succede in Repl.it:

File "main.py", line 1
     print (12.format("world"))
               ^
 SyntaxError: invalid syntax

Prova a verificare gli altri metodi per gestire le stringhe che Python mette a disposizione e che si possono utilizzare con print:

print("I AM NOT SHOUTING".swapcase())
print("this is shouting".swapcase())
print("This Is All Uppercase".upper())
print("This Is All Lowercase".lower())
print("This Just Swaps Upper & Lowercase Characters".swapcase())
print("   this has no padding   ".strip())
print("---this has no dashes padding it---".strip("-"))
print("---neither - does - this ---".strip("-"))
print("i want this to be a title".title())
print("...NOt WHackY TyPiNG...".strip(".").lower().capitalize())

Copiando l’intera sequenza puoi vedere all’opera tutto questo codice e come i vari metodi intervengono per modificare la formattazione del messaggio originale:

i am not shouting
THIS IS SHOUTING
THIS IS ALL UPPERCASE
this is all lowercase
tHIS jUST sWAPS uPPER & lOWERCASE cHARACTORS
this has no padding
this has no dashes padding it
neither - does - this
I Want This To Be A Title
Not whacky typing

Gli esempi mostrati sono simili e seguono una implementazione semplice: un metodo viene chiamato per essere applicato su una stringa. Alcuni metodi prevedono un prametro, altri no.

L’ultimo esempio, “Not whacky typing”, è un po’ più complesso degli altri. Questo esempio integra i metodi. L’integrazione di metodi (a catena – method chaining) è una tecnica di programmazione molto utilizzata perché diminuisce la quantità di codice che bisogna scrivere. Tuttavia la strada da percorrere è piena di insidie per i meno esperti (soprattutto per chi è all’inizio!).

L’esempio “Not whacky typing” funziona solo perché ciascun metodo scelto, opportunamente selezionato tra quelli disponibili, ci restituisce una stringa. Poiché ciascun metodo restituisce una stringa è possibile applicare in successione i tre metodi sfruttando questa catena.

Non tutt’i metodi restituiscono delle stringhe – questo è vero anche per quei metodi che si possono applicare a delle stringhe. Vediamo con un esempio:

print ("We should ban bendy bananas!".count("ban"))

Il risultato di questa elaborazione è il numero 2. Se mettiamo in sequenza un ulteriore metodo per elaborare una stringa, il sistema genererà un errore. Infatti il metodo count() restituisce un numero. Upper() è un metodo che si applica alle stringhe non ai numeri:

print ("We should ban bendy bananas!".count("ban").upper())

Traceback (most recent call last):
  File "main.py", line 2, in
    print ("We should ban bendy bananas!".count("ban").upper())
AttributeError: 'int' object has no attribute 'upper'

Così tanti metodi – non farti prendere dal panico!

Una nota importante a proposito dei metodi: l’importante, per adesso, è capire l’applicazione dei metodi e non conoscere tutt’i metodi che esistono. Non devi impararli tutti. I programmatori imparano ad utilizzarli programmando, a volte li scoprono per caso e acquisiscono dimestichezza con l’uso frequente che ne deriva. Per quei metodi meno richiesti, gli sviluppatori devono fare ricerche su internet o nei forum specializzato come StakOverflow. Ovviamente è disponibile della documentazione ufficiale in italiano. Per chi si fosse appassionando alla materia e vorrebbe un testo per fare da guida nell’universo sterminato di Python, suggeriamo questo libro.

Ancora codice Python

Finora abbiamo esplorato molti elementi ed alcune tecniche indispensabili per programmare in Python. Prima di chiudere questa seconda parte della guida, concludiamo con un esempio di programma Python per fare l’analisi di una pagina web che identifica elementi ce possiamo definire in funzione delle nostre esigenze.

Molti degli esempi precedenti possono essere replicati sia su OnlineGDB.com che su Repl.it. Per quest’ultimo esempio dobbiamo ricorrere a funzioni più complesse che sono disponibili solo su Repl.it.

Per evitare di generare traffico web inutile, possiamo cominciare con un “heredoc” – una modalità per popolare una stringa con dati via via più complessi che possono essere gestiti con l’uso delle virgolette.

È molto facile creare un heredoc con Python – basta utilizzare una serie di tre virgolette come si può vedere nell’esempio che segue dove una breve pagina HTML è stata inserita e su cui andremo ad operare.

html = """<html>
<head>
<title>This is a webpage</title>
</head>
<body>
<h1>A header</h1>
<p>Some Text</p>
<h2>first level two header</h2>
<p>another paragraph this one containing a link to <a href="https://google.com">google</a></p>
<h2>second level two header</h2>
<h2>third level two header</h2>
<p>a footer containing a link to <a href="https://example.com">example.com</a></p></body></html>"""

print(html)

L’esecuzione di questo codice dovrebbe stampare il codice HTML. L’uso di “”” consente di scrivere una stringa che si sviluppa su più righe, potendo contenere virgolette.

Adesso abbiamo una pagina web memorizzata sul computer e ne possiamo fare l’analisi.

Una cosa che si potrebbe fare è, ad esempio, scrivere un programma per capire l’HTML ed estrarre alcuni elementi che ci interessano.

Un vantaggio enorme dei linguaggi della programmazione moderna come Python è la grandissima comunità open source. Con un approccio del tutto decentralizzato e spontaneo, gli utenti hanno sviluppato una quantità inimmaginabile di codice software. Questi blocchi possono essere utilizzati per sviluppare nuovi programmi (nei limiti concessi dalle licenze). Codice in questa forma si chiama package oppure librerie o moduli. Ci sono delle sottili differenze tra package e moduli che non affrontiamo perché non rientra tra gli obiettivi di questa guida. I due termini (package e modulo) sono spesso usati in modo intercambiabile.

Uno dei moduli per fare l’analisi dell’HTML è BeautifulSoup4. Trattandosi di software che preleva le pagine web da un sito ci sono evidenti implicazioni sull’uso di questo software e non possiamo non raccomandare di fare un uso moderato ed etico.

BeautifulSoup4 si può importare in Repl.it utilizzando il gestore per l’importazione di moduli di Repl.it come mostrato nell’immagine che segue:

- import di BeautifulSoup4 per Python in Repl.it
Import di BeautifulSoup4 per Python in Repl.it
  • Selezionare il package manager (scatola cerchiata in rosso)
  • Questo si trova nel menu di navigazione sulla sinistra della pagina [1]
  • Cerca “BeautifulSoup4” nella finestra per la ricerca di packages [2]
Repl.it, aggiungere un package all'ambiente Python
Repl.it, aggiungere un modulo all’ambiente Python

Dobbiamo selezionare “beautifulsoup4 Screen-scraping library” – la versione attuale è la 4.8.2 ma potrebbe essere diversa al momento della consultazione di questa guida.

Repl.it – La ricerca per il modulo BeautifulSoup4

Confermiamo la volontà di scaricare il pacchetto per utilizzo con il nostro progetto cliccando sul tasto verde. Si attiva la procedura, accompagnata da alcuni messaggi nella finestra di dialogo:

Repl.it: Updating package configuration

 --> /usr/local/bin/python3 -m poetry add beautifulsoup4
 Using version ^4.8 for beautifulsoup4
 Updating dependencies
 Resolving dependencies…
 Writing lock file
 Package operations: 2 installs, 0 updates, 0 removals
 Installing soupsieve (2.0)
 Installing beautifulsoup4 (4.8.2) 

Terminata la procedura di download, BeautifulSoup4 è pronto per l’uso e possiamo procedere con l’analisi della nostra pagina HTML.

Poiché BeautifulSoup4 è una integrazione esterna dobbiamo dire in maniera esplicita che intendiamo utilizzarlo. Il gestore dei pacchetti ha un ruolo ben preciso e tra i suoi compiti non c’è quello di informare il nostro programma che vogliamo utilizzare i pacchetti. Per questo, Python ha il comando import con cui informare il programma delle nostre necessità. La documentazione delle librerie spiega come importare le funzionalità di cui abbiamo bisogno. Nel caso specifico di BeautifulSoup4, la documentazione ci spiega come bisogna procedere per fare l’import:

from bs4 import BeautifulSoup 
soup = BeautifulSoup(html, 'html.parser')

Il codice spiega a Python che intendiamo importare il modulo di BeautifulSoup per poi procedere con la creazione di un oggetto “soup” che deriva dall’acquisizione della nostra pagina HTML. Un oggetto è una cosa su cui si possono applicare dei metodi – proprio come l’esempio di poco fa.

Forse hai notato l’uso di virgolette singole nel codice che abbiamo appena scritto che racchiudono html.parser  (‘html.parser’). Python tollera un uso intercambiabile tra virgolette semplici e doppie, purché si rispetti la regola di non mischiare . Questa flessibilità è particolarmente utile in alcuni casi come questo:

" this contains a single quote -> ' <- here "

Oppure

" this contains a double quote -> ' <- here "

Alcuni programmatori preferiscono le virgolette mentre altri l’apicetto (virgoletta singola).

Gli oggetti di BeautifulSoup hanno moltissimi metodi. In questo esempio proviamo ad estrarre alcuni elementi di una pagina web dall’HTML.

  • Il titolo di pagina
  • Il target e l’anchor text di qualsiasi link nella pagina
  • Elementi H2

La documentazione può essere piuttosto scoraggiante per i lettori alle prime armi, ma contiene dettagli sui metodi che possiamo utilizzare su un elemento di “soup” per acquisire i dati di cui all’elenco precedente. Adesso abbiamo la necessità di introdurre un nuovo concetto: attributi. Senza entrare in dettaglio anche su questo per adesso evitiamo una spiegazione formale. Dovrebbe essere sufficiente pensare agli attributi come delle cose simili ai metodi che restituiscono un valore, ma che non hanno dei parametri né tantomeno le parentesi.

  • Acquisire il titolo di pagina: soup.title.string ( questo è un attributo )
  • Trovare tutt’i link: links = soup.find_all("a") ( find_all è un metodo. “a” è il tag HTML per I link. Questo codice restituisce una lista di anchor html tags
  • Trova tutti gli H2: headers = soup.find_all("h2") (come sopra ma con tag “h2” )

L’esecuzione di processi legati all’elaborazione di liste è particolarmente semplice in Python, il che significa che possiamo utilizzare del codice simile a quello già sviluppato per i loop visti in precedenza per analizzare ogni link nella lista dei link creata utilizzando il codice:

links = soup.find_all("a")

e quindi

for link in soup.find_all("a"):
     # process each link

La documentazione suggerisce di acquisire il target con

link.get("href")

L’anchor text è il contenuto del tag link e può essere estratto con una tecnica simile a quella utilizzata per estrarre il titolo di pagina dimostrato prima:

link.string

e quindi:

for link in soup.find_all("a"):
     print("Target: {}",format(link.get('href')))
     print("Anchor: {}",format(link.string))

Adesso che abbiamo analizzato ogni sezione di codice, possiamo integrarlo tutto e fare una prova generale del nostro programma su Repl.it:

from bs4 import BeautifulSoup 

html = """<html>
<head>
<title>This is a webpage</title>
</head>
<body>
<h1>A header</h1>
<p>Some Text</p>
<h2>first level two header</h2>
<p>another paragraph this one containing a link to <a href="https://google.com">google</a></p>
<h2>second level two header</h2>
<h2>third level two header</h2>
<p>a footer containing a link to <a href="https://example.com">example.com</a></p></body></html>"""



soup = BeautifulSoup(html, 'html.parser') 

# We have commented out the next line so it will not be run.

# print(html)



print ("The title of the page is '{}'".format( soup.title.string ))



print ("Links on this page:")
for link in soup.find_all('a'):
     print("Target: {}",format(link.get('href')))

     print("Anchor: {}",format(link.string))

 
print ("H2 tags on this page:") 

for header in soup.find_all('h2'):

     print(header.string)  

  

Se l’importazione di BeautifulSoup4 è andata a buon fine, il programma dovrebbe terminare restituendo questo:

The title of the page is 'This is a webpage'
Links on this page:
Target:  https://google.com
Anchor:  google
Target:  https://example.com
Anchor:  example.com
H2 tags on this page:
first level two header
second level two header
third level two header

Fatto! Siamo partiti da uno script di appena una riga che faceva una semplice stampa a video, per arrivare all’estrazione di alcuni elementi di una pagina HTML. Complementi per la costanza e per l’interesse nell’argomento – adesso puoi iniziare a programmare!

Riassumendo…

Siamo certi che questa sezione della guida, molto pratica, ti aiuterà a capire le potenzialità nell’imparare Python per il SEO.

Abbiamo utilizzato due interpreti Python (Repl.it e OnlineGDB.com), evitando le problematiche che spesso s’incontrano nell’installazione di un linguaggio di programmazione sul proprio computer.

Nella prima sezione di questa guida abbiamo analizzato degli equivalenti a Python a cui guardare per capire i concetti fondamentali della programmazione. Abbiamo altresì sviluppato dei test su variabili per controllare il flusso dei nostri programmi.

Hai potuto vedere come si definiscono le variabili ed i loop per una gestione accorta e semplice del codice con cui gestire attività ripetitive.

Abbiamo quindi visto i metodi e loro applicazioni – costrutti fondamentali nella programmazione ad oggetti.

Abbiamo concluso la sessione con l’introduzione di pacchetti di terze parti (packages, detti anche moduli) e ne abbiamo utilizzato uno (BeautifulSoup4). Adesso hai del codice Python con cui estrarre elementi di una pagina web per successive analisi.

THANK YOU!
If you have any questions in the meantime, please contact help@majestic.com
You have successfully registered for a Majestic Demo. A Customer Advisor will contact you shortly to schedule a suitable time to connect.