Link checker in Python

Pubblicato: 13 settembre 2009 in Python

L’altro giorno (era più di un mese fa, quindi era l’altro giorno), il mio amico Sandro mi fa: “Senti un po’, io da anni tengo una pagina in cui mi salvo tutti i link che mi interessano”, “Una specie di delicious”, gli faccio io. “Eh?” mi risponde, “non importa”.
“Comunque,” mi fa, “siccome sono passati molti anni vorrei trovare un modo semplice per capire quali link sono ancora vivi e quali no”, “ah, sì, tipo il link checker“, gli faccio io. “Eh?” mi risponde, “non importa”.

Eravamo lì su un’amaca nel suo giardino, con il mio eeepc che mi arroventava le ginocchia, gli dico “In Python ci metti cinque minuti”, “eh, sì,” mi dice, “solo che il Python io non lo so, dovrei?”.

Dovresti.

Ci siam messi lì e cinque minuti dopo è venuto fori questo.

import urllib2, sgmllib

class MyParser(sgmllib.SGMLParser):
    "A simple parser class."

    def parse(self, s):
        "Parse the given string 's'."
        self.feed(s)
        self.close()

    def __init__(self, verbose=0):
        "Initialise an object, passing 'verbose' to the superclass."

        sgmllib.SGMLParser.__init__(self, verbose)
        self.hyperlinks = []

    def start_a(self, attributes):
        "Process a hyperlink and its 'attributes'."

        for name, value in attributes:
            if name == "href" and value[:4] == 'http':
                self.hyperlinks.append(value)

    def get_hyperlinks(self):
        "Return the list of hyperlinks."

        return self.hyperlinks

if __name__ == "__main__":
# Get something to work with.
        f = urllib2.urlopen("http://www.repubblica.it")
        s = f.read()

# Try and process the page.
# The class should have been defined first, remember.
        myparser = MyParser()
        myparser.parse(s)

# Get the hyperlinks.
        links = myparser.get_hyperlinks()
        for l in links:
                try:
                        urllib2.urlopen(l)
                        print l, ": Ok"
                except ValueError:
                        pass
                except urllib2.URLError:
                        pass
                except urllib2.HTTPError as e:
                        print "Error: %s (code %s)" % (l, e)

Riferimenti:

Python and HTML Processing

Lascia un commento

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione / Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione / Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione / Modifica )

Google+ photo

Stai commentando usando il tuo account Google+. Chiudi sessione / Modifica )

Connessione a %s...