Perché mi appare “ 'ResultSet' non ha alcun attributo 'findAll'” utilizzando BeautifulSoup in Python?
-
13-09-2019 - |
Domanda
Così sto imparando Python lentamente, e sto cercando di fare una semplice funzione che attirerà i dati dalla pagina punteggi di un gioco online. Questo è il codice di qualcun altro, che ho riscritto in una funzione (che potrebbe essere il problema), ma io sono sempre questo errore. Ecco il codice:
>>> 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.
Soluzione
Wow. Trittico fornito un grande rispondere per una questione connessa.
Si può vedere, dal codice sorgente di BeautifulSoup , che le sottoclassi ResultSet
list
.
Nel tuo esempio, get_rows
è un'istanza della classe ResultSet
di BS,
e dal momento di BS sottoclassi ResultSet
list
, che significa get_rows un elenco .
get_rows
, come un esempio di ResultSet
, fa non avere un metodo findAll
implementato; da qui l'errore.
Cosa Trittico ha fatto in modo diverso è quello di iterate su quella lista.
Il metodo di Trittico funziona perché tutti gli elementi dell'elenco get_rows
sono istanze della classe Tag del BS; che ha un metodo di findAll
.
Quindi, 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 per Leonard Richardson: In nessun modo intendo sminuire la qualità del vostro lavoro facendo riferimento ad essa come BS; -)