^^Python. www pg per la gestione del sito

dfn errate >>>

 

------------

Sorry, FrontPage does not support inline SVG.

------------

 

 

  1. bool(struttura vuota) == False
  2. 'a' not in []  ==  True
  3. '987654321'[-3:]  ==  '321'
  4. ls = [1, 2, 3]

    for ix, x in enumerate(ls) :
        ls[ix] =  x*x

 

  1. stackoverflow/filter-search-for-ul

None  is the sole value of the type NoneType  >>>

 

Leonardo ---------------------------

  1. usi lo stesso stile di formatting in python e javascript ?
  2. preferisci camelCase o under_score ?
  3. se conosci Jupyter notebook, hai opinione a rigurardo?

 

Se pensi a:

    1byte = 8 bit

    11111111

    00000000

domando:

- li numeri da 0 o da 1 ?  b0 b1 ... b7  oppure  b1 b2 ... b8 ?

- la numerazione inizia da sinistra o da dx ?

 

directory tree structure in python

  1. pep-0471 -- os.scandir() function -- a better and faster directory iterator
  2. realpython 
    1. python-print
    2. working-with-files-in-python/#traversing-directories-and-processing-files
  3. janakiev/python-filesystem-analysis

os.path Common pathname manipulations

os.path.abspath('W:/www')  # per essere system-independent

os.path.split(path)[0]  ==  os.path.dirname(path)     nm: "head"

os.path.split(path)[1]  ==  os.path.basename(path)   nm: tail

os.path.join(head, tail) == path

os.path.splitext(file_name)[0]      

os.path.splitext(file_name)[1]     estensione

os.walk(top, topdown=True, onerror=None, followlinks=False)

top e' la radice dell'albero da percorrere

top= os.path.abspath('W:/www')  # per essere system-independent

Restituisce una 3-pla spiegata dal codice sotto

for  dir_path, dir_names, file_names  in os.walk(top):

    print('current directory', dir_path)  # is a str
    print(dir_names)                      # lista nomi direttori
    print(file_names)                     # lista nomi files
    for file_name in file_names:
        if os.path.splitext(file_name)[1] == '.htm': # selez file extension .htm
            print(os.path.join(dir_path, file_name))





with open(fnp, mode='r', encoding='cp1252') as f1:

lib/functions#open   open e' built-in functione. Esiste os.open che e' low level.

encoding

7.2. Reading and Writing Files inputoutput#reading-and-writing-files

f1 = open('fnm')   # open to read 
    read_data = f1.read()
 
with open('fb', mode='r', encoding='cp1252') as f1:  #wrabt  a(ppend) r+
    read_data = f.read()
with open('fb', mode='w', encoding='utf-8') as f1:  #wrabt  a(ppend) r+
    read_data = f.read()

It is good practice to use the with keyword when dealing with file objects.

lib/contextlib | reference/compound_stmts#with

 

interpreter#source-code-encoding

to declare that Windows-1252  encoding is to be used in the source code file,
the first line of the source code file should be:

# -*- coding: cp1252 -*-
 

La Questione dell' ENCODING

Per leggere/scrivere su file testo in un certo  charactercode

howto/unicode#reading-and-writing-unicode-data

encoding is the name of the encoding used to decode or encode the file

anche leggendo un file di testo 1 carattere per volta

f.read(1)

il sistema ha letto un buffer di testo, e lo decodifica tutto, quindi segnala errore in questa fase, migliaia di caratteri oltre il primi che volevo leggere.

Bisogna passare a leggere il file come binario; e' un'opzione incompatibile con l'opzione di encoding, che occorre quindi eventualmente cancellare.

il carattere   ° = '\xb0' = 1011 0000  provoca

err_msg: utf-8 codec can't decode byte 0xb0 in position 1438: invalid start byte.

Gli start byte utf8: i byte

ASCII     00-7F  equi: il bit piu' pesante e' 0          0xxxxxxx

cp1252   C0-FF  equi: i 2 bit piu' pesanti sono 11  11xxxxxx

encode

https://docs.python.org/3/library/codecs.html#codecs.register_error

https://docs.python.org/3/library/stdtypes.html#str.encode

https://docs.python.org/3/library/stdtypes.html#bytes.decode

 

ix Informatica; codici.

HTML freeformatting: newline e extra blank del codice html

free-formatting del codice html, cioe' di FrontPage

quando nel codice html va a capo (newline \d)

codice html    reso nel reader    oss:
sem\npre sem pre \n     reso blank
sem \npre sem pre '  \n'  la coppia blank-\n   reso blank
<em>\n

\t\ta capo<em>

a capo a capo

\n\t\t  reso stringa vuota

conclu: la resa di \n non e' sempre uguale, bensi' varia a seconda del contesto in cui si trova, cio' complica la programmazione poiche' occorre prevedere casi, non semplicemente sostituire un qualcosa a un carattere.

In pratica ho trovato casi di 2 parole consecutive separate dalla sola andata a capo, cioe' carattere \n newline; puo' darsi che siano stati i miei maneggi diretti sul codice.

 

Rimuovere i newline mantenendo la corretta spaziatura non e' quindi un risultato certo.

2 parole separate da un newline sono rese

es:

<p><dfn>sistema di forze e'
equilibrato</dfn></p>

sistema di forze e' equilibrato

in html esiste il tag <pre>, nel qualcaso i blank contano !!

es: <pre>     <dfn>    gigi  </dfn<pre>   qui i blank sono voluti, non sono sopprimibili; non si puo' salvare il file dopo aver tolto tutti i blank, poiche' i <pre> sono modificati.

Il codice per passare da freeformatted a in-riga

' '.join(s.split())   restituisce in riga la stringa-testo freeformatting.
>>> a  = '<dfn>\ngigi mario'
>>> a.split()
['<dfn>', 'gigi', 'mario']
>>> ' '.join(a.split())
'<dfn> gigi mario'

attenzione: ha introdotto un blank che non esisteva, il reader html rende in 2 modi diversi !

 

Nel caso si parta da stringa vuota non fa errore, e restituisce stringa vuota

''.split() == []                   split di stringa vuota produce lista vuota

'gigi'.join([]) == ''             join di lista vuota produce stringa vuota

'gigi'.join(''.split()) == ''    join(split) di stringa vuota produce stringa vuota

 

'rob'.split()  ==  ['rob']

'ro b'.split()  ==  ['ro','b']

'ro\nb'.split()  ==  ['ro', 'b']

 

'gigi'.join(['rob'])  ==  'rob'

'gigi'.join(['ro', 'b'])  ==  'rogigib'

 

pagine non originali del librosito

  1. Watt - il primo motore a vapore. Pompa, locomotiva, battello. Regolatore centrifugo. Cavallo-potenza. Le fabbriche.
  2. Pompa a vapore. (http://web.tiscali.it/vanni_38)

ordinare stringhe

Alterazioni ord

  1. blank a inizio stringa
  2. maiuscole e minuscole sono trattate diverse: ord case sensitive
  3. se c'e' un tag a inizio stringa

Soluzioni

3: togliere <b> <b/>

es: Document Object Model (DOM), ma poi era un caso isolato, e quindi ho preferito correggere questo.

 

Document Object Model (DOM)

in prima battuta ho trasformato tutto in minuscolo s.lowercase(), ma ci sono parole che usano entrambi i case in modo significativo, da migliorare

 

Per un certo tempo nei titoli il formato

^^ Titolo     lasciavo un blank tra ^^ e il titolo

^^Titolo      ora no

In tutto circa 70 titoli, li correggo a mano.

Ma devo mettere un warning nel programma.

 

Non mettere links nel titolo, almeno all'inizio per non alterare l'ordine.

 

Non so perche'

e' stato trasformato in

poiche' <canvas> e' finito nel codice html, poiche' il codice si e' trasformato

Titolo che iniziano in minuscolo

  • aPToP a Practical Theory of Programming - Eric C.R. Hehner.
  • afF. Comportamento ideale, idealizzato.
  • deve essere fatto un ordinamento case insensitive

     

     

     

     

    soup = BeautifulSoup(html_doc, "html.parser")

    https://www.crummy.com/software/BeautifulSoup/

    html_doc  e' una stringa python che contiene il testo in codice html da analizzare

    es

    html_doc= "<p>un <em>qualsiasi</em> pezzo di testo
    in <code>codice html</code></p> anche         ' <b>sgangherato</b>' cioe' con

     errori, e in  freeformatting <em>come questo</em></p>"

    Qui sotto e' come reso dal reader html che stai usando

    un qualsiasi pezzo di testo in codice html

    anche ' sgangherato' cioe' con errori, e in freeformatting come questo

    soup = BeautifulSoup(html_doc, "html.parser")

    Beautiful Soup transforms a complex HTML document into a complex tree of Python objects. But you’ll only ever have to deal with about

    4 kinds of objects:    BeautifulSoup    Tag    NavigableString        Comment.

    soup.get_text()

    estra il testo puro, cioe' senza tags.

    Viene lasciato come e' nel codice htm, in freeformatting

    soup.prettify()  

    lascia nel testo i blank e newline di freeformatting.

    html_doc = "<p class="title first_level" id="title_id"><b>The Dormouse's story</b></p>"
    soup = BeautifulSoup(html_doc, "html.parser")

    soup.p  e' una variabile con

     

    soup.p <p class="tit_1lv" id="tit_id" ><b>       The Dormouse's      story</b></p>
    type(soup.p) <class 'bs4.element.Tag'>
       
    str(soup.p) <p class="title first_level" id="title_id"><b>The Dormouse's story</b></p>

    e' il codice html contenuto nell'oggetto Tag di BS

       
    tag = soup.p per comodita' di scrittura abbreviamo. Piu' specifico potrei usare l'identificatore p_tag, ma sto scrivendo in generale come esemplificativo per qualsiasi altro tag
       
    tag.contents [<b>       The Dormouse's      story</b>]
      <class 'list'> ma lista di che ?  a video sembrano stringhe, ma da programma sembrano tag-type, da approfondire.
       
    tag.string       The Dormouse's      story
    type(tag.string) <class 'bs4.element.NavigableString'>
       
    tag.get_text()       The Dormouse's      story
      <class 'str'>
       
    tag.attrs {'class': ['title', 'first_level'], 'id': 'title_id'}
    # dict di liste, rpr attributi, qui è non vuoto
      <class 'dict'>
       
    tag['class'] ['title', 'first_level']
      <class 'list'>
       
    tag['id'] title_id
      <class 'str'>
       
    tag.get('id') title_id
      <class 'str'>
       
    x.parent.name body
      <class 'str'>
       

     

    tag.string is None   when

    <tag>gigi<b></b></tag>

    <tag>gigi<b>gio</b></tag>

    <tag>gigi<br></tag>

    <tag><br>gigi</tag>

     

    <tag>i<b>gigi</b></tag>

     

     

     

     

    soup.find_all('dfn')
      [<dfn>misure dirette</dfn>, <dfn>misure indirette</dfn>]
     
    type(soup.find_all('dfn')
      <class 'bs4.element.ResultSet'> 

     

    type(x.string)
      <class 'bs4.element.NavigableString'> 

     

    nel caso pero' che il contenuto di x non sia puro testo, BeautifulSoup risponde

    x.string
      None 
    type(x.string)
      <class 'NoneType'> 
     
     

    tag.string   e' None quando  tag e' una struttura che deve essere sbrogliata

     

    <p  prova tag.string  <b>bold</b>  <i>italic</>  <em>enfatico</em> </p>

     
    isinstance(xxx, type(None))  equi   xxx is None
     

    Kinds of objects