Perché mi appare “ 'ResultSet' non ha alcun attributo 'findAll'” utilizzando BeautifulSoup in Python?

StackOverflow https://stackoverflow.com/questions/992183

  •  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.

È stato utile?

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; -)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top