[Linuxtrent] Re: aiuto con python

  • From: Daniele Nicolodi <daniele@xxxxxxxxxx>
  • To: linuxtrent@xxxxxxxxxxxxx
  • Date: Wed, 29 Oct 2014 18:32:07 +0100

Ciao Marco,

On 29/10/14 17:35, Marco Ciampa wrote:
> l'idea è di sostituire questa <img src="data ..." name=graphics1"...> con
> la stessa cosa ma salvando l'immagine decodificata .png in
> images/graphics1.png e cambiare il link in <img src="images/graphics1.png" 
> ...> 
> 
> Ho buttato li tutto per dare un'idea di dove stavo andando a parare.
> Premetto che non sono mai stato un mago neanche delle espressioni regolari.
> ecco qua:

Usare le espressioni regolari per fare il parsing di un documento HTML
non è certo la soluzione che raccomanderei.

Se l'HTML che devi modificare è un documento XML valido, puoi usare una
delle librerie che ti permettono di lavorare agevolmente con esso. Per
il tuo caso io credo userei xml.etree dalla libreria standard.

Se l'HTML non è strettamente XML, puoi usare la libreria BeautifulSoup.

Non dici dove sorgono i problemi, ma di seguito un paio di commenti:

> #!/usr/bin/python3
> 
> import re
> import base64
> import os
> 
> #Created images folder
> directory='images'
> if not os.path.exists(directory):
>     os.makedirs(directory)
> 
> #Source file
> FIN=open('cvpcb_EN-LIBO.html')
> #Destination file
> FOUT=open('cvpcb_EN-out.html','w')

Lo standard di stile per il codice Python, che consiglio vivamente di
adottare sconsiglia i nomi tutti maiuscoli per le variabili, i nomi in
maiuscolo sono solitamente utilizzati per identificare le costanti.
Inoltre si preferisce uno spazio prima e dopo il segno di =, e tra il #
ed il primo carattere dei commenti.

> for line in FIN:
>     #Search for image tag
>     cerca = re.search('$(.*) (<img src="data:image/png;base64,.*) (.*)', line)

Questa regular exprerssion non la capisco, perchè usare il metodo
search() con un espressione ancorata all'inizio della riga? Io userei
match(), poi l'ultimo gruppo '(.*)' risulterà sempre vuoto a causa del
.* che lo precede.

>     if (cerca):
>         preamble=cerca.group(0)
>         resto=cerca.group(1)
>         print ("found in line ",n_line,":",preamble[0:10])

Io trovo

   print("found in line {:}: {:}".format(n)_line, preamble[:10]))

più facile da leggere.

>     #cerca = re.search('<img src="data:image/png;base64,(.*?)" 
> name="(graphics.?.?.?)" (.*)', line)

Costruendo opportunamente l'espressione regolare precedente non avresti
bisogno di interpretare la riga di input due volte.  Anche qui il
problema probabilmente è che l'ultimo (.*) si mangia tutto quello che
segue e non solo quello che ti serve.

>     #If img tag matches ... convert it into image
>         #start=cerca.group(1)
>         #img=cerca.group(2)
>         #name=cerca.group(3)

Dalla mia interpretazione di quello che cerchi di fare con l'espressione
regolare, name è group(2) e img è group(3).

>         #FIMG=open('images/'+name+'.png','w')
>         #print ("found in line ",n_line,":",'"'+name+'"')
>         #FIMG.close
>     n_line=n_line+1

Se vuoi iterare un oggetto iterabile tenendo il conto del numero di
iterazioni il il modo Python-ico di farlo è:

   for n_line, line in enumerate(FIN):
        ...


Spero di essere stato d'aiuto.

Ciao,
Daniele

-- 
Per iscriversi  (o disiscriversi), basta spedire un  messaggio con OGGETTO
"subscribe" (o "unsubscribe") a mailto:linuxtrent-request@xxxxxxxxxxxxx


Other related posts: