2009-06-14 4 views
8

Quindi sto imparando lentamente Python e sto cercando di creare una semplice funzione che tracci i dati dalla pagina dei punteggi più alti di un gioco online. Questo è il codice di qualcun altro che ho riscritto in una funzione (che potrebbe essere il problema), ma sto ricevendo questo errore. Ecco il codice:Perché sto ricevendo "'ResultSet' non ha attributo 'findAll'" che utilizza BeautifulSoup in Python?

>>> from urllib2 import urlopen 
>>> from BeautifulSoup import BeautifulSoup 
>>> def create(el): 
    source = urlopen(el).read() 
    soup = BeautifulSoup(source) 
    get_table = soup.find('table', {'id':'mini_player'}) 
    get_rows = get_table.findAll('tr') 
    text = ''.join(get_rows.findAll(text=True)) 
    data = text.strip() 
    return data 

>>> create('http://hiscore.runescape.com/hiscorepersonal.ws?user1=bigdrizzle13') 

Traceback (most recent call last): 
    File "<pyshell#18>", line 1, in <module> 
    create('http://hiscore.runescape.com/hiscorepersonal.ws?user1=bigdrizzle13') 
    File "<pyshell#17>", line 6, in create 
    text = ''.join(get_rows.findAll(text=True)) 
AttributeError: 'ResultSet' object has no attribute 'findAll' 

Grazie in anticipo.

+0

Per quello che vale: denominare le variabili "prima", "seconda", ecc. è uno stile terribile. Dovresti davvero essere più descrittivo - i nomi specifici dipendono da te, ovviamente, ma potrei usare "urlcontent", "parser", "mp_tables" e così via. –

+0

È il mio terzo giorno con Python. Ho bisogno di farlo per tenerlo dritto nella mia testa. Questo andrà meglio col passare del tempo ... – Alex

+0

Ho cambiato i nomi delle variabili. Spero che sia meglio. – Alex

risposta

19

Wow. Triptych ha fornito un numero great answer a una domanda correlata.

Possiamo vedere, from BeautifulSoup's source code, che ResultSet sottoclassi list.

Nel tuo esempio, get_rows è un'istanza della classe di BS ResultSet,
e poiché ResultSet sottoclassi di BS list, che significa get_rows è una lista.

get_rows, come un esempio di ResultSet, fa non hanno un metodo findAll implementato; quindi il tuo errore.
Ciò che Triptych ha fatto in modo diverso è quello di iterare su tale elenco.
Il metodo di Triptych funziona perché gli elementi nell'elenco get_rows sono istanze della classe Tag di BS; che ha un metodo findAll.

Così, per risolvere il codice, è possibile sostituire le ultime tre righe del tuo metodo create con qualcosa di simile:

for row in get_rows: 
    text = ''.join(row.findAll(text=True)) 
    data = text.strip() 
    print data 

Nota a Leonard Richardson: In nessun modo intendo sminuire la qualità della il tuo lavoro si riferisce ad esso come BS ;-)

+0

Grazie per l'urlo :) – Triptych

+0

Non dirlo: un grande lavoro merita il riconoscimento! – bernie

+0

'text = True' era proprio quello che stavo cercando! –