kwb
09-05-2013, 15:52
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:
<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>
Quello che interessa a me è ciò che si trova dentro i tr con classe even e classe odd.
Il problema di fondo è che per filtrare l'html faccio una cosa così:
for i in result.select("table.WRD tr.even td.FrWrd") or result.select("table.WRD tr.odd td.FrWrd"):
print i.text
Tuttavia, così facendo, BS prima mi stampa tutti i risultati even ( si c'è una classe interna ancora ma non ci interessa per ora ) e poi mi stampa gli odd. Il guaio è che, come si vede dall'html, gli even e gli odd sono mischiati, e vengono visualizzati per "rilevanza" della traduzione, esempio: se certo Last mi mostra prima come traduzione "Ultimo" ( sostantivo ) piuttosto che "Durare" ( verbo ). C'è un modo rapido, senza smanettare eccessivamente con strutture dati, per selezionare le classi sia even che odd ma nell'ordine in cui vengono presentate dall'html?
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
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:
<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>
Quello che interessa a me è ciò che si trova dentro i tr con classe even e classe odd.
Il problema di fondo è che per filtrare l'html faccio una cosa così:
for i in result.select("table.WRD tr.even td.FrWrd") or result.select("table.WRD tr.odd td.FrWrd"):
print i.text
Tuttavia, così facendo, BS prima mi stampa tutti i risultati even ( si c'è una classe interna ancora ma non ci interessa per ora ) e poi mi stampa gli odd. Il guaio è che, come si vede dall'html, gli even e gli odd sono mischiati, e vengono visualizzati per "rilevanza" della traduzione, esempio: se certo Last mi mostra prima come traduzione "Ultimo" ( sostantivo ) piuttosto che "Durare" ( verbo ). C'è un modo rapido, senza smanettare eccessivamente con strutture dati, per selezionare le classi sia even che odd ma nell'ordine in cui vengono presentate dall'html?
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