Frage

So habe ich den folgenden Satz von Code-Parsing köstlich Informationen. Er druckt Daten aus einer Köstliches Seite im Format

Lesezeichen | Anzahl der Personen

Lesezeichen | Anzahl der Personen etc ...

Ich habe die folgende Methode verwenden, um diese Informationen zu finden.

def extract (soup):
    links = soup.findAll('a',rel='nofollow')
    for link in links:
        print >> outfile, link['href']

    hits = soup.findAll('span', attrs={'class': 'delNavCount'})
    for hit in hits:
        print >> outfile, hit.contents


#File to export data to
outfile = open("output.txt", "w")

#Browser Agent
br = Browser()    
br.set_handle_robots(False)
br.addheaders = [('User-agent', 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.1) Gecko/2008071615 Fedora/3.0.1-1.fc9 Firefox/3.0.1')]


url= "http://www.delicious.com/asd"
page = br.open(url)
html = page.read()
soup = BeautifulSoup(html)
extract(soup)

Aber das Problem war, dass einige Lesezeichen eine Reihe von Menschen didnt haben, so dass ich es anders, so zu analysieren, entschieden, dass ich die Daten gleichzeitig bekommen würde und die Lesezeichen und die Anzahl der Personen nebeneinander ausdrucken.

EDIT: Got es 15-5 Sekunden mit dieser aktualisierten Version, noch mehr Anregungen

def extract (soup):
    bookmarkset = soup.findAll('div', 'data')
    for bookmark in bookmarkset:
        link = bookmark.find('a',)
        vote = bookmark.find('span', 'delNavCount')
        try:
            print >> outfile, link['href'], " | " ,vote.contents
        except:
            print >> outfile, "[u'0']"
    #print bookmarkset


#File to export data to
outfile = open("output.txt", "w")

#Browser Agent
br = Browser()    
br.set_handle_robots(False)
br.addheaders = [('User-agent', 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.1) Gecko/2008071615 Fedora/3.0.1-1.fc9 Firefox/3.0.1')]


url= "http://www.delicious.com/asd"
page = br.open(url)
html = page.read()
soup = BeautifulSoup(html)
extract(soup)

Die Leistung auf das ist schrecklich aber dauert 17 Sekunden die erste Seite zu analysieren, und um 15 Sekunden danach auf einer recht gut Maschine. Es verschlechtert sich deutlich, wenn aus dem ersten Bit-Code zu dem zweiten Bit gehen. Gibt es etwas, ich kann perf hier imporve tun?

War es hilfreich?

Lösung

Ich verstehe nicht, warum Sie vote zuweisen - zweimal. Die erste Aufgabe ist nicht notwendig und in der Tat ziemlich schwer, da sie das gesamte Dokument analysieren muss - bei jeder Iteration. Warum?

   vote = BeautifulSoup(html)
   vote = bookmark.findAll('span', attrs={'class': 'delNavCount'})

Andere Tipps

Wenn Sie über die Leistung betrifft Sie vielleicht einen Blick auf etwas, dass die Gespräche mit dem köstlichen API, anstatt Screen-Scraping, dh pydelicious . Zum Beispiel:

>>> import pydelicious
>>> pydelicious.get_userposts('asd')
[{'extended': '', 'description': u'Ksplice - System administration and software blog', 'tags': u'sysadm, blog, interesting', 'url': u'http://blog.ksplice.com/', 'user': u'asd'

BeautifulSoup tut viel mehr als das, was Sie in diesem Fall benötigen. Wenn Sie wirklich die Geschwindigkeit aufdrehen wollen, dann würde ich vorschlagen, einen grundlegenden Ansatz von urllib unter + ein einfacher Zeile-für-Zeile-Parser.

Das Parsen einer Seite die Größe des „asd“ Beispiel auch unter einer Sekunde auf einer modernen Maschine nehmen sollte.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top