View Full Version : [Python] XML, parsing HTML, HTML INPUT
Ciao,
avete presente aNobii?
http://www.anobii.com/
Io lo adoro! Ma non divaghiamo. Ho un sacco di libri nella wish list, cioè libri che non ho, ma desidero leggere prima o poi. Ogni tanto li cerco sui siti online di vendita di libri; molti si trovano facilmente, altri meno.
Mi è venuta la voglia, durante questi giorni di feste, di scrivere uno script che andasse in giro a cercare i libri per me. Inizialmente speravo di cavarmela molto facilmente, ma la cosa si è un po' complicata strada facendo, soprattutto perché non tutti i siti ti permettono di cercare per ISBN...
Se volete avere un'idea di cosa intendo, aprite dall'allegato il file anobii.txt (input), quindi libreria.xml (output).
Purtroppo ho almeno tre problemi... che metto tutti qui in un'unica discussione :sperem:
Come si può inserire il riferimento a un xsl all'interno di un xml? Per il momento l'ho fatto brutalmente aprendo il file xml come fosse un file di testo qualunque e andando a scriverci forzatamente l'istruzione apposita. È piuttosto brutta come soluzione, possibile non ce ne sia una migliore?
L'ultima istruzione del seguente blocco può andare in errore:
response = urllib2.urlopen(self.url)
forms = ClientForm.ParseResponse(response, backwards_compat=False)
form = forms[1]
if self.titolo: form["query_title"] = self.titolo
if self.autore: form["query_author"] = self.autore
if self.isbn : form["query_code"] = self.isbn
form["query_shelf"] = (p_lang,)
form["query_category"] = ("AAA",)
form["query_availability"] = ("ALL",)
page = urlopen(form.click()).read()
restituendo il tipico errore:
'ascii' codec can't encode character u'\xf6' in position 17: ordinal not in range(128)
Ho trovato una pagina html in cui gli elementi INPUT non sono inseriti all'interno di una FORM... Quindi non ho idea di come possa fare a eseguire nel programma la compilazione dei campi di testo e il click sul tastino submit... cosa che se fossero in una FORM potrei fare con ClientForm (vedi punto 2)
Avete qualche suggerimento? :help:
cdimauro
06-01-2009, 16:47
1) Non ho usato la libreria più avanzata di Python per quanto riguarda la manipolazione di XML, ma ti assicuro che è molto ben fornita. Sicuramente ci sarà un libreria che ti permette di fare ciò che chiedi.
2). L'errore sta nella urlopen().read() o nella form.click() ? Prova a riscrivere quel codice così:
Link = form.click()
page = urlopen(Link).read()
e vedi se il problema sta nella prima o nella seconda riga, possibilmente riportando anche il valore di Link.
3). Può essere una pagina che fa uso di Flash? Perché con l'HTML standard tutti i valori di input stanno in una qualche forma, per cui i valori li puoi sempre prelevare.
Grazie dell'aiuto :)
1) Non ho usato la libreria più avanzata di Python per quanto riguarda la manipolazione di XML, ma ti assicuro che è molto ben fornita. Sicuramente ci sarà un libreria che ti permette di fare ciò che chiedi.
Ho trovato una libreria che mi permette di applicare lo stile, nel senso di generare un file html elaborando l'xml in base a quello stile. Io però vorrei un file xml con la riga:
<?xml-stylesheet type="text/xsl" href="libreria.xsl"?>
e questo non riesco a capire come farlo...
2). L'errore sta nella urlopen().read() o nella form.click() ? Prova a riscrivere quel codice così:
Link = form.click()
page = urlopen(Link).read()
e vedi se il problema sta nella prima o nella seconda riga, possibilmente riportando anche il valore di Link.
Risolto. Il form voleva i parametri in latin1, non in unicode.
È quindi bastato aggiungere
.encode("latin-1")
al valore da scrivere nella casella di testo della form.
3). Può essere una pagina che fa uso di Flash? Perché con l'HTML standard tutti i valori di input stanno in una qualche forma, per cui i valori li puoi sempre prelevare.
È una pagina asp. Questa:
http://www.hoepli.it/avanzata.asp
L'ho guardata col DOM inspector, e non mi pare proprio che i campi INPUT siano inseriti in una FORM... Porc... :muro:
Può darsi che il programmatore che ha scritto quella pagina ASP se n'è fregato degli standard... (strano, eh?!)
cdimauro
08-01-2009, 08:37
Grazie dell'aiuto :)
Figurati. Anzi, mi spiace risponderti soltanto adesso ma ho avuto un po' da fare in questi giorni.
Ho trovato una libreria che mi permette di applicare lo stile, nel senso di generare un file html elaborando l'xml in base a quello stile. Io però vorrei un file xml con la riga:
<?xml-stylesheet type="text/xsl" href="libreria.xsl"?>
e questo non riesco a capire come farlo...
Hum. E' un tag speciale. Non credo sia direttamente gestibile come un qualunque nodo.
Però, come ti dicevo, non ho esperienza con le altre librerie (sono tante), ed è molto probabile che riescano a gestire anche questo caso.
Risolto. Il form voleva i parametri in latin1, non in unicode.
È quindi bastato aggiungere
.encode("latin-1")
al valore da scrivere nella casella di testo della form.
Infatti. Era sicuramente un problema di encoding, ma volevo capire da dove arrivava. :p
È una pagina asp. Questa:
http://www.hoepli.it/avanzata.asp
L'ho guardata col DOM inspector, e non mi pare proprio che i campi INPUT siano inseriti in una FORM... Porc... :muro:
Può darsi che il programmatore che ha scritto quella pagina ASP se n'è fregato degli standard... (strano, eh?!)
Veramente vedo diverse form, e ci sono anche i controlli di input per la ricerca. Guarda qui:
<form action="cercato.asp" method="post" name="frmAdvBooxter">
<input type="hidden" name="ft" value="adv">
<td align="center" valign="top" width="646">
<br>
<!-- QUI INCLUDE BANNER -->
<table width="612" border="0" cellspacing="0" cellpadding="0">
<tr>
<td colspan="2" width="155"><img src="img/tit_avanzata.gif" alt="" height="18" width="155" border="0"></td>
<td align="right" width="350" background="img/px_riga.gif"><img src="img/px_riga.gif" alt="" height="18" width="1" border="0"></td>
<td colspan="2" width="107" background="img/px_riga.gif" align="right"><img src="/img/angolo_dx.gif" border="0"></td>
</tr>
<tr>
<td width="1" height="20" background="img/px_blu.gif"><img src="img/px_blu.gif" alt="" height="1" width="1" border="0"></td>
<td colspan="3" align="center" width="610" height="20">
<table width="96%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td class="testo_blu"><br><b>Cerca tra gli oltre 500.000 libri</b> presenti nella <a href="http://www.hoepli.it/libreriainternazionale.asp">Grande Libreria Online</a> <a href="http://www.hoepli.it"><span class="testo_blu2_b">HOEPLI<font color="#6495ed">.it</font></span></a> digitando una o più parole nei campi sottostanti.
</td>
</tr>
</table>
<br>
<table width="96%" border="0" cellspacing="2" cellpadding="3">
<tr>
<td class="testo_piccolo" width="458"><span class="testo_piccolo"><b>TITOLO</b> (PAROLE CONTENUTE NEL TITOLO O NEL SOTTOTITOLO)<br>
</span><input type="text" name="bytit" size="50" border="0"></td>
<td class="testo_piccolo" width="109"></td>
</tr>
<tr>
<td class="testo_piccolo" width="458"><b>AUTORE</b><br>
<input type="text" name="byaut" size="50" border="0"></td>
<td class="testo_piccolo" width="109"></td>
</tr>
<tr>
<td class="testo_piccolo" width="458"><b>EDITORE</b><br>
<input type="text" name="byed" size="50" border="0"></td>
<td class="testo_piccolo" width="109"></td>
</tr>
Ho lasciato perdere il DOM inspector, e sono andato a guardarmi il codice nudo e crudo, come hai fatto tu.
E sono inorridito, di fronte a quello spettacolo! :mbe:
In pratica la form c'è, ma in questo modo terrificante:
</td>
<form action="cercato.asp" method="post" name="frmAdvBooxter">
<input type="hidden" name="ft" value="adv">
<td align="center" valign="top" width="646">
:eek: :muro:
Per forza che ClientForm non riesce a capire che c'è quella form! Non posso certo dargli torto...
Infatti se con l'extension per firefox "webdeveloper" faccio "visualizza sorgente generato", webdeveloper mi chiuder il tag:
</td>
<form action="cercato.asp" method="post" name="frmAdvBooxter"></form>
<span title="<input name="ft">" class="webdeveloper-display-form-details"><input name="ft"></span>
<input class="webdeveloper-unhidden" name="ft" value="adv" type="text">
<td align="center" valign="top" width="646">
Ma chi l'ha fatto 'sto sito, da cui mai e poi mai comprerò alcunché?
Meglio andarci fisicamente, alla Hoepli.
Pensa te... :muro:
cdimauro
09-01-2009, 08:12
La cosa strana è che il DOM inspector avrebbe dovuto trovarti in ogni caso il form e i controlli di input.
Comunque concordo: è un sito realizzato veramente male. :stordita:
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.