Topic: problemi di ordinamento attributi con HTMLparser  (Letto 1000 volte)

0 Utenti e 1 Visitatore stanno visualizzando questo topic.

Offline Tungsteno

  • python erectus
  • ***
  • Post: 181
  • Punti reputazione: 0
    • Mostra profilo
    • Sviluppo Videogiochi
problemi di ordinamento attributi con HTMLparser
« il: Agosto 19, 2015, 19:01 »
Ho notato che HTMLparser ritorna gli attributi che vede nello stesso ordine in cui li incontra e quindi per 2 tag con gli stessi attributi ma con posizione differente degli attributi il codice per identificare quei tag non è equivalente, anche se nella definizione ufficiale dell' html non si tiene conto della posizione degli attributi ma solo del loro valore.

Mi permetto di farvi un'esempio (anche se immagino voi già lo sapete) per farvi capire meglio quello che ho in mente, se io ho:
[codice]<body>
<link href="./foo/css" rel="stylesheet" type="text/css">
<link rel="stylesheet" href="./foo/pippo.css" type="text/css">
<link rel="stylesheet" type="text/css" href="./foo/pippo.css">
</body>[/codice]

e il seguente codice per identificare i link e farci qualcosa:
[codice]
class myParser(HTMLParser):
    def __init__(self, **kwargs):
        self._cssparse_step = 0
    def handle_starttag(self, tag, attributes):
        if tag == "link":
            for name, value in attributes:
                if name == "rel" and value == "shortcut icon":
                    self._islinktag = True
                if name == "rel" and value == "stylesheet" and self._cssparse_step<3 and self._islinktag:
                    self._isstylesheet = True
                if name == "href" and self._isstylesheet:
                    self._isstylesheet = False                  
                    self._maincss_links.append(value)
                    self._cssparse_step += 1[/codice]

ovviamente ne salta uno di link ma in realtà dovrebbero essere considerati tutti e 3.

Mi chiedo se esiste un sistema in HTMLParser per rendere senza ordine il parsing dei tag in maniera da non dover scrivere altro codice "superfluo" per identificare ogni possibile posizione degli attributi di un tag (in stile beautifulsoup).
Qualcuno mi dirà "ma esiste già beautifulsoup per questo" è vero, ma io ho bisogno di usare una libreria build-in per evitare possibili problemi di compatibilità con i dispositivi mobili (e non ho la certezza che beautifulsoup sia compatibile).
 
Grazie a tutti.
« Ultima modifica: Agosto 19, 2015, 19:08 da Tungsteno »

Offline GlennHK

  • python sapiens sapiens
  • ******
  • Post: 1.638
  • Punti reputazione: 1
    • Mostra profilo
    • La Tana di GlennHK
Re: problemi di ordinamento attributi con HTMLparser
« Risposta #1 il: Agosto 19, 2015, 20:38 »
Non puoi mettere gli attributi in un dict?

Offline Tungsteno

  • python erectus
  • ***
  • Post: 181
  • Punti reputazione: 0
    • Mostra profilo
    • Sviluppo Videogiochi
Re: problemi di ordinamento attributi con HTMLparser
« Risposta #2 il: Agosto 20, 2015, 13:26 »
Grazie GlennHK, ma avrei voluto qualcosa di più efficiente visto che ho parecchi tag da valutare, anche se in realtà non ho mai testato direttamente la loro efficienza, so solo che leggendo in giro vengono sconsigliati da usare in operazioni di parsing o applicazioni simili.
Se non arriva nessun altro suggerimento però mi sa che dovrò accontentami dei dict sperando che non siano effettivamente così pesanti.

Offline GlennHK

  • python sapiens sapiens
  • ******
  • Post: 1.638
  • Punti reputazione: 1
    • Mostra profilo
    • La Tana di GlennHK
Re: problemi di ordinamento attributi con HTMLparser
« Risposta #3 il: Agosto 20, 2015, 13:50 »
Pesanti, i tag html se hanno cinque attributi è pure assai...

Offline Tungsteno

  • python erectus
  • ***
  • Post: 181
  • Punti reputazione: 0
    • Mostra profilo
    • Sviluppo Videogiochi
Re: problemi di ordinamento attributi con HTMLparser
« Risposta #4 il: Agosto 20, 2015, 23:02 »
Hai ragione, ma non sono gli attributi che mi spaventano, ma la quantità di tag, e visto che superano di gran lunga il migliaio in una pagina e tenendo anche conto che il numero di pagine può variare da una decina a oltre 30, puoi capire che ammettendo che l'inserzione degli attributi di un tag in un dict avvenga in media in 0,0001 secondi (e la mia è una stima molto a caso, visto che non ho testato, quindi correggetemi se sbaglio) e moltiplicando questa cifra per almeno 1000 (stima anche questa) e il risultato lo moltiplichiamo ancora per il numero di pagine stimate (diciamo 30) avremmo circa 3 secondi di elaborazione, che vorrei poter ottimizzare se è possibile.
Tra l'altro sarei curioso di sapere in che modo beautifulsoup elabora i tag in maniera da non avere problemi di ordinamento come HTMLParser ed essere relativamente veloce. Sicuramente ho qualche deficit nelle mie conoscenze in fatto di parsing.

Grazie ancora
« Ultima modifica: Agosto 20, 2015, 23:04 da Tungsteno »

Offline Python

  • python sapiens sapiens
  • ******
  • Post: 2.045
  • Punti reputazione: 2
  • Radon - Cyclomatic Complexity of your Python code
    • Mostra profilo
    • Radon - Cyclomatic Complexity of your Python code
Re: problemi di ordinamento attributi con HTMLparser
« Risposta #5 il: Agosto 21, 2015, 08:47 »
Secondo me stai sbagliando approccio. Ottimizzare prima di sapere qual è il problema con precisione serve a poco. Non si dice, infatti, "premature optimization is the root of all evil"? Il dizionario è un tipo built-in, non può fare schifo. Anzi, non credo si possa fare molto meglio in termini di performance. Ovvio che le cose cambiano a seconda dell'uso che ne vuoi fare. Tanti oggetti piccoli? Credo che vincano le tuple. Oggetti grandi? Dizionari.

Mi pare poi che la tua stima sia proprio sbagliata. 100 microsecondi mi sembra troppo per inserire un attributo in in dizionario. In ogni caso, la maggior parte del tempo sarà usata dal parser, non dall'inserzione degli attributi.

Quindi ti consiglio di scrivere la tua applicazione e poi fare dei test usando dei profiler (ce ne sono nella libreria standard). Se vuoi ottimizzare il parsing lxml vince a mani basse, però occupa più memoria di HTMLParser. BeautifulSoup occupa ancora più memoria di lxml da solo. Se è una applicazione per dispositivi mobili anche l'uso della memoria è da tenere in conto.

EDIT: Due numeri riguardo ai dizionari (e liste, tuple, set):
http://stackoverflow.com/questions/1418588/how-expensive-are-python-dictionaries-to-handle
« Ultima modifica: Agosto 21, 2015, 08:49 da Python »

Offline Tungsteno

  • python erectus
  • ***
  • Post: 181
  • Punti reputazione: 0
    • Mostra profilo
    • Sviluppo Videogiochi
Re: problemi di ordinamento attributi con HTMLparser
« Risposta #6 il: Agosto 21, 2015, 23:08 »
Grazie Python, sto valutando i tuo consigli e facendo qualche test.

Offline RicPol

  • python sapiens sapiens
  • ******
  • Post: 2.851
  • Punti reputazione: 9
    • Mostra profilo
Re: problemi di ordinamento attributi con HTMLparser
« Risposta #7 il: Agosto 22, 2015, 09:14 »
mah sì, a parte ciò che ti è stato giustamente detto, il problema è che non si capisce bene cosa stai cercando di fare. In effetti gli attributi di un tag in html possono essere inseriti in un ordine qualsiasi, e anche il tuo codice dovrebbe semplicemente accettare questa realtà: due tag con gli stessi attributi sono lo stesso tag. Nel tuo esempio, hai tre tag che identificano la stessa risorsa. Cosa stai cercando di fare, trovare doppioni?
Ovviamente sei sempre in tempo a usare i pezzi grossi come BeautifulSoup, ma non capisco qual è il tuo scopo in tutto questo.

(tra l'altro, sempre a proposito di ottimizzazione: molto codice di parsing viene eseguito una tantum... e allora non vale la pena di ottimizzarlo. Lascia che ci metta 5 minuti in più, invece di sprecare 2 ore a ridurre il tempo di esecuzione a 30 secondi... e in quelle 2 ore vai a vederti un film).