dfn errate >>>
------------
------------
for ix, x in enumerate(ls) :
ls[ix] = x*x
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 ?
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
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
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))
lib/functions#open open e' built-in functione. Esiste os.open che e' low level.
encoding
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 -*-
howto/unicode#reading-and-writing-unicode-data
encoding is the name of the encoding used to decode or encode the file
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.
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
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.
es:
<p><dfn>sistema di forze e'
equilibrato</dfn></p>
sistema di forze e' equilibrato
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.
' '.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'
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
da: <h1>Effetto del tag <canvas></h1>
a: <h1>Effetto del tag <canvas></h1>
deve essere fatto un ordinamento case insensitive
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>"
un qualsiasi pezzo di testo
in codice html
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
.
estra il testo puro, cioe' senza tags.
Viene lasciato come e' nel codice htm, in freeformatting
lascia nel testo i blank e newline di freeformatting.
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>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