|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: Jul 2003
Città: Alessandria
Messaggi: 10167
|
[Python] Beautiful Soup filtraggio multiplo
Mi sto cimentando con uno script che passando tramite parametro una parola ( in inglese ) me ne restituisce la traduzione ( le possibili traduzioni ) in italiano.
Per far ciò sto usando Beautiful Soup, ma siccome non lo conosco molto bene ( così come ho una conoscenza base di python ) mi sono subito imbattuto in un problema. Questa è la porzione saliente della pagina che voglio filtrare: Codice HTML:
<table> <tbody><tr class="wrtopsection"><td colspan="3" title="Principal Translations"><strong>Principal Translations/Traduzioni principali</strong></td></tr> <tr class="even"><td class="FrWrd"><strong>home</strong> <em class="POS2">n</em></td><td> (house, apartment)</td><td class="ToWrd">casa <em class="POS2">nf</em></td></tr> <tr class="even"><td> </td><td colspan="2" class="FrEx">They've just bought their first home.</td></tr> <tr class="even"><td> </td><td colspan="2" class="ToEx">Hanno appena comprato la loro prima casa.</td></tr> <tr class="odd"><td class="FrWrd"><strong>home</strong> <em class="POS2">n</em></td><td> (household)</td><td class="ToWrd">casa <em class="POS2">nf</em></td></tr> <tr class="odd"><td> </td><td colspan="2" class="FrEx">His home is always noisy and happy.</td></tr> <tr class="odd"><td> </td><td colspan="2" class="ToEx">Casa sua è sempre allegra e vivace.</td></tr> <tr class="even"><td class="FrWrd"><strong>home</strong> <em class="POS2">n</em></td><td> (headquarters, main office)</td><td class="ToWrd">patria <em class="POS2">nf</em></td></tr> <tr class="even"><td> </td><td colspan="2" class="FrEx">Detroit is the home of the US's automobile industry.</td></tr> <tr class="even"><td> </td><td colspan="2" class="ToEx">Detroit è la patria dell'industria automobilistica statunitense.</td></tr> <tr class="odd"><td class="FrWrd"><strong>home</strong> <em class="POS2">adj</em></td><td> (domestic)</td><td class="ToWrd">casa <em class="POS2">nf</em></td></tr> <tr class="odd"><td> </td><td colspan="2" class="FrEx">He's really into home decorating right now.</td></tr> <tr class="odd"><td> </td><td colspan="2" class="ToEx">Proprio adesso si sta dedicando alla decorazione della casa.</td></tr> <tr class="even"><td class="FrWrd"><strong>home</strong> <em class="POS2">adv</em></td><td> (toward or to home)</td><td class="ToWrd">casa <em class="POS2">nf</em></td></tr> <tr class="even"><td> </td><td colspan="2" class="FrEx">Let's go home.</td></tr> <tr class="even"><td> </td><td colspan="2" class="ToEx">Andiamo a casa.</td></tr> <tr class="odd"><td colspan="3" class="wrtopsection"> </td></tr><tr class="wrtopsection"><td colspan="3" title="Additional Translations" class="additional"><strong>Additional Translations</strong></td></tr> <tr class="even"><td class="FrWrd"><strong>home</strong> <em class="POS2">adj</em></td><td> (of one's country)</td><td class="ToWrd">del proprio paese, di casa propria <em class="POS2"></em></td></tr> <tr class="even"><td> </td><td class="To2"></td><td class="ToWrd">nazionale <em class="POS2">agg</em></td></tr> <tr class="even"><td> </td><td colspan="2" class="FrEx">When we travel abroad, it's good to find a home newspaper from time to time.</td></tr> <tr class="even"><td> </td><td colspan="2" class="ToEx">Quando si viaggia all'estero, ogni tanto è piacevole trovare un giornale di casa propria.</td></tr> <tr class="odd"><td class="FrWrd"><strong>home</strong> <em class="POS2">adj</em></td><td> (sports: a team's locality)</td><td class="ToWrd">di casa <em class="POS2">avv</em></td></tr> <tr class="odd"><td> </td><td colspan="2" class="FrEx">The home team is going to win the game.</td></tr> <tr class="odd"><td> </td><td colspan="2" class="ToEx">La squadra di casa sta per vincere la partita.</td></tr> <tr class="even"><td class="FrWrd"><strong>home</strong> <em class="POS2">adj</em></td><td> (sports: game played locally)</td><td class="ToWrd">in casa <em class="POS2">avv</em></td></tr> <tr class="even"><td> </td><td colspan="2" class="FrEx">It's a home game today.</td></tr> <tr class="even"><td> </td><td colspan="2" class="ToEx">È una partita in casa oggi.</td></tr> <tr class="odd"><td class="FrWrd"><strong>home</strong> <em class="POS2">adv</em></td><td> (deeply)</td><td class="ToWrd">mostrare<a title="conjugate mostrare" class="conjugate" href="/conj/ITverbs.aspx?v=mostrare">⇒</a>, far vedere<a title="conjugate far vedere" class="conjugate" href="/conj/ITverbs.aspx?v=far+vedere">⇒</a> <em class="POS2">vtr</em></td></tr> <tr class="odd"><td> </td><td class="To2"></td><td class="ToWrd">rendersi conto <em class="POS2">v rif</em></td></tr> <tr class="odd"><td> </td><td class="To2"></td><td class="ToWrd">toccare con mano <em class="POS2">vtr</em></td></tr> <tr class="odd"><td> </td><td colspan="2" class="FrEx">His words brought home how much he's been suffering.</td></tr> <tr class="odd"><td> </td><td colspan="2" class="ToEx">Le sue parole mostravano quanto stia soffrendo.</td></tr> <tr class="odd"><td> </td><td colspan="2" class="ToEx">Dalle sue parole ci si rende conto di quanto stia soffrendo.</td></tr> <tr class="odd"><td> </td><td colspan="2" class="ToEx">Dalle sue parole si può toccare con mano quanto stia soffrendo.</td></tr> <tr class="even"><td class="FrWrd"><strong>home</strong> <em class="POS2">n</em></td><td> (residence)</td><td class="ToWrd">casa <em class="POS2">nf</em></td></tr> <tr class="even"><td> </td><td colspan="2" class="FrEx">They have a second home on the Mediterranean.</td></tr> <tr class="even"><td> </td><td colspan="2" class="ToEx">Hanno una seconda casa sul Mediterraneo.</td></tr> <tr class="odd"><td class="FrWrd"><strong>home</strong> <em class="POS2">n</em></td><td> (institution, asylum)</td><td class="ToWrd">casa di riposo <em class="POS2">nf</em></td></tr> <tr class="odd"><td> </td><td class="To2">per anziani</td><td class="ToWrd">ricovero <em class="POS2">nm</em></td></tr> <tr class="odd"><td> </td><td colspan="2" class="FrEx">She's living in an old peoples' home.</td></tr> <tr class="odd"><td> </td><td colspan="2" class="ToEx">Vive in una casa di riposo per anziani.</td></tr> <tr class="even"><td class="FrWrd"><strong>home</strong> <em class="POS2">n</em></td><td> (native place, homeland)</td><td class="ToWrd">casa <em class="POS2">nf</em></td></tr> <tr class="even"><td> </td><td colspan="2" class="FrEx">I missed home a lot when I was studying abroad.</td></tr> <tr class="even"><td> </td><td colspan="2" class="ToEx">Quando studiavo all'estero, mi mancava molto casa.</td></tr> <tr class="odd"><td class="FrWrd"><strong>home</strong> <em class="POS2">n</em></td><td> (games: destination)</td><td class="ToWrd">pareggiare<a title="conjugate pareggiare" class="conjugate" href="/conj/ITverbs.aspx?v=pareggiare">⇒</a>, andare in parità <em class="POS2">vi</em></td></tr> <tr class="odd"><td> </td><td colspan="2" class="FrEx">I can make it home with one more roll of the dice.</td></tr> <tr class="odd"><td> </td><td colspan="2" class="ToEx">Posso pareggiare con un altro tiro di dadi.</td></tr> <tr class="even"><td class="FrWrd"><strong>home</strong> <em class="POS2">n</em></td><td> (baseball: home plate)</td><td class="ToWrd">casa base <em class="POS2">nf</em></td></tr> <tr class="even"><td> </td><td colspan="2" class="FrEx">He stole from third base to home.</td></tr> <tr class="even"><td> </td><td colspan="2" class="ToEx">Ha rubato casa base partendo dalla terza base.</td></tr> <tr class="odd"><td class="FrWrd"><strong>home</strong> <em class="POS2">vi</em></td><td> (go or return to home)</td><td class="ToWrd">ritornare a casa, tornare a casa <em class="POS2">vi</em></td></tr> <tr class="odd"><td> </td><td class="To2"></td><td class="ToWrd">trovare la via di casa, trovare la strada di casa <em class="POS2">vtr</em></td></tr> <tr class="odd"><td> </td><td colspan="2" class="FrEx">This pigeon always homes the quickest.</td></tr> <tr class="odd"><td> </td><td colspan="2" class="ToEx">Questo piccione è sempre il più veloce a tornare a casa.</td></tr> <tr class="odd"><td> </td><td colspan="2" class="ToEx">Questo piccione è sempre il più veloce a trovare la via di casa.</td></tr> <tr class="even"><td class="FrWrd"><strong>home</strong> <em class="POS2">vi</em></td><td> (military: go towards a target)</td><td class="ToWrd">dirigersi <em class="POS2">v rif</em></td></tr> <tr class="even"><td> </td><td colspan="2" class="FrEx">The missile homed on the heat radiation given off by the tank.</td></tr> <tr class="even"><td> </td><td colspan="2" class="ToEx">Il missile si è diretto verso la radiazione di calore emessa dal carro armato.</td></tr> <tr class="odd"><td class="FrWrd"><strong>home</strong> <em class="POS2">vi</em></td><td> (navigate)</td><td class="ToWrd">dirigersi <em class="POS2">v rif</em></td></tr> <tr class="odd"><td> </td><td colspan="2" class="FrEx">We're homing in on our target.</td></tr> <tr class="odd"><td> </td><td colspan="2" class="ToEx">Ci stiamo dirigendo verso il nostro obiettivo.</td></tr> <tr class="even"><td class="FrWrd"><strong>home</strong> <em class="POS2">vtr</em></td><td> (bring, send home)</td><td class="ToWrd">mandare a casa, fare arrivare a casa <em class="POS2">vtr</em></td></tr> <tr class="even"><td> </td><td colspan="2" class="FrEx">He managed to home a pigeon all the way from France to England.</td></tr> <tr class="even"><td> </td><td colspan="2" class="ToEx">Riuscì a mandare a casa un piccione viaggiatore dalla Francia all'Inghilterra.</td></tr> <tr class="odd"><td class="FrWrd"><strong>home</strong> <em class="POS2">vtr</em></td><td> (direct to a target)</td><td class="ToWrd">dirigere<a title="conjugate dirigere" class="conjugate" href="/conj/ITverbs.aspx?v=dirigere">⇒</a>, guidare<a title="conjugate guidare" class="conjugate" href="/conj/ITverbs.aspx?v=guidare">⇒</a> <em class="POS2">vtr</em></td></tr> <tr class="odd"><td> </td><td colspan="2" class="FrEx">The missile was homed to its target.</td></tr> <tr class="odd"><td> </td><td colspan="2" class="ToEx">Il missile è stato diretto verso il bersaglio.</td></tr> </tbody> </table> Il problema di fondo è che per filtrare l'html faccio una cosa così: Codice:
for i in result.select("table.WRD tr.even td.FrWrd") or result.select("table.WRD tr.odd td.FrWrd"): print i.text Ovvero, se c'è una sequenza: even, even, odd, even, odd . Voglio che mi stampi questa esatta sequenza e non ( come fa adesso ): even, even, even, odd, odd. P.S: Se volete una visione più chiara dell'html, questo è il link: http://www.wordreference.com/enit/home
__________________
Dell XPS 13 (9350) :: i5-2500K - HD6870 - AsRock Z68 Pro3 - Corsair Vengeance 8GB (4x2) DDR3 :: Samsung Galaxy S4 GT-i9505
|
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
Non conosco Beautiful Soup, ma potresti recuperare tutti i dati senza filtrare per i tag even e odd, ed esegure il filtraggio soltanto dopo, da Python.
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro @LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys |
![]() |
![]() |
![]() |
#3 | |
Senior Member
Iscritto dal: Jul 2003
Città: Alessandria
Messaggi: 10167
|
Quote:
Codice:
... toRemove=result.find_all(class_="wrtopsection") [remove.extract() for remove in toRemove] parsedLeft = result.find_all("td", "FrWrd") parsedRight = result.find_all("td","ToWrd") for i,k in zip(parsedLeft, parsedRight): print i.strong.string, "Si traduce con: ", k.em.previous_sibling Cosa significa: Codice:
[remove.extract() for remove in toRemove] ![]() In buona sostanza quello che fa quell'istruzione è prendere gli elementi con classe wrtopsection ( istruzione sopra ) e poi secondo un meccanismo che mi sfugge, dando un remove.extract() , rimuove quegli elementi dalla variabile result ( result è una variabile di tipo BS, che contiene tutta la struttura html - e anche altro ) ![]() ![]() Il problema che mi si presenta ora è che la traduzione ( ovvero la parola in italiano ) non è racchiusa in una struttura analoga ( in termini di tag ) alla parola in inglese: in alcuni casi succede che ci sia più di una traduzione disponibile e di conseguenza viene messa in un nuovo td a capo. Inoltre, le traduzioni non sono racchiuse dentro i tag strong, costringendomi ad usare la proprietà previous_sibling. Nel caso ci fosse qualcuno che se ne intende di BS, sono tutt'orecchi! ![]()
__________________
Dell XPS 13 (9350) :: i5-2500K - HD6870 - AsRock Z68 Pro3 - Corsair Vengeance 8GB (4x2) DDR3 :: Samsung Galaxy S4 GT-i9505
|
|
![]() |
![]() |
![]() |
#4 | |
Senior Member
Iscritto dal: May 2007
Città: Milano
Messaggi: 7103
|
Quote:
La stessa cosa l'hai in javascript con Codice:
for(i=0;i < 10; a[i]=0) ;
__________________
Apple Watch Ultra + iPhone 15 Pro Max + Rog Ally + Legion Go |
|
![]() |
![]() |
![]() |
#5 | |
Senior Member
Iscritto dal: Jul 2003
Città: Alessandria
Messaggi: 10167
|
Quote:
Quel for, preso li com è, lo leggo come: parti da i=0, vai avanti finchè i è minore di 10, ti fermi quando il valore del vettore a(in posizione i) è 0. Ed essenzialmente fa solo un giro perchè viene inizializzato solo la prima "cella" del vettore ( visto che i non viene incrementato ).. Ho provato a cercare iteratore d'azione python ( o action iterator python ![]() ![]()
__________________
Dell XPS 13 (9350) :: i5-2500K - HD6870 - AsRock Z68 Pro3 - Corsair Vengeance 8GB (4x2) DDR3 :: Samsung Galaxy S4 GT-i9505
|
|
![]() |
![]() |
![]() |
#6 | |
Senior Member
Iscritto dal: May 2007
Città: Milano
Messaggi: 7103
|
Quote:
Codice:
for(i=0;i < 10; a[i++]=0) ; Codice:
var a = [] for(i=0;i < 10; a[i++]=0) ; a // => [0, 0, 0, 0, 0, 0, 0, 0, 0, 0] P.S: per esempio Codice:
>>> [i%2 for i in range(0,10)] [0, 1, 0, 1, 0, 1, 0, 1, 0, 1] >>>
__________________
Apple Watch Ultra + iPhone 15 Pro Max + Rog Ally + Legion Go Ultima modifica di The_ouroboros : 10-05-2013 alle 10:27. |
|
![]() |
![]() |
![]() |
#7 | |
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
Quote:
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro @LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys |
|
![]() |
![]() |
![]() |
#8 |
Senior Member
Iscritto dal: Jul 2003
Città: Alessandria
Messaggi: 10167
|
Si, ok che si tratti di una list comprehension l'avevo capito
![]() Quello che non mi è chiaro è, dove va a finire l'output? Non è perso? Perchè ho provato dalla console interattiva una cosa del genere: Codice:
[i*2 for i in range(0,5)] Poi però se faccio: Codice:
print i,type(i) Infatti se faccio: Codice:
for k in i: print k Di conseguenza, non capisco qual è il significato di azzerare ( o fare operazioni ) su una variabile che poi viene persa... ![]() EDIT: Anche il tuo link mostra che c'è sempre una variabile alla sinistra dell'uguale, a prende, appunto, l'output della list comprehension...
__________________
Dell XPS 13 (9350) :: i5-2500K - HD6870 - AsRock Z68 Pro3 - Corsair Vengeance 8GB (4x2) DDR3 :: Samsung Galaxy S4 GT-i9505
|
![]() |
![]() |
![]() |
#9 | |
Senior Member
Iscritto dal: Mar 2007
Città: Milano Beach
Messaggi: 1696
|
Quote:
__________________
~ Cthulhu: MacBookPro 13.3" ~ Azathoth: D510MO |
|
![]() |
![]() |
![]() |
#10 | |
Senior Member
Iscritto dal: May 2007
Città: Milano
Messaggi: 7103
|
Quote:
![]()
__________________
Apple Watch Ultra + iPhone 15 Pro Max + Rog Ally + Legion Go |
|
![]() |
![]() |
![]() |
#11 |
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
E' esattamente come avete immaginato. La list comprehension è un'espressione, che fa un certo lavoro, ma non sta scritto da nessuna parte che la lista generata la si debba per forza memorizzare da qualche parte.
Nello specifico, l'unica cosa che conta è eliminare quegli elementi, e quell'espressione lo fa in maniera semplice e compatta. Ma non efficiente, perché la lista viene generata per intero, pur buttandola via; per gli amanti delle prestazioni si potrebbe sostituire con un expression generator, ma i cui elementi vanno comunque consumati.
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro @LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys |
![]() |
![]() |
![]() |
#12 | |
Senior Member
Iscritto dal: Jul 2003
Città: Alessandria
Messaggi: 10167
|
Quote:
Codice:
... toRemove=result.find_all(class_="wrtopsection") [remove.extract() for remove in toRemove] parsedLeft = result.find_all("td", "FrWrd") parsedRight = result.find_all("td","ToWrd") for i,k in zip(parsedLeft, parsedRight): print i.strong.string, "Si traduce con: ", k.em.previous_sibling Codice:
toRemove=result.find_all(class_="wrtopsection") ![]()
__________________
Dell XPS 13 (9350) :: i5-2500K - HD6870 - AsRock Z68 Pro3 - Corsair Vengeance 8GB (4x2) DDR3 :: Samsung Galaxy S4 GT-i9505
|
|
![]() |
![]() |
![]() |
#13 | |
Senior Member
Iscritto dal: Mar 2007
Città: Milano Beach
Messaggi: 1696
|
Quote:
Poi extract() andrà a modificare gli oggetti.
__________________
~ Cthulhu: MacBookPro 13.3" ~ Azathoth: D510MO |
|
![]() |
![]() |
![]() |
#14 |
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
E' così, infatti.
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro @LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 13:43.