¿Por qué obtengo "'ResultSet' no tiene el atributo 'findAll'" usando BeautifulSoup en Python?
-
13-09-2019 - |
Pregunta
Así que estoy aprendiendo Python lentamente y estoy tratando de crear una función simple que extraiga datos de la página de puntuaciones más altas de un juego en línea.Este es el código de otra persona que reescribí en una función (que podría ser el problema), pero recibo este error.Aquí está el código:
>>> 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'
Gracias de antemano.
Solución
Guau.Tríptico proporcionó una excelente respuesta a una pregunta relacionada.
Podemos ver, del código fuente de BeautifulSoup, eso ResultSet
subclases list
.
En tu ejemplo, get_rows
es un ejemplo de BS ResultSet
clase,
y desde BS ResultSet
subclases list
, eso significa get_rows es una lista.
get_rows
, como un ejemplo de ResultSet
, hace no tener un findAll
método implementado;de ahí tu error.
Lo que Triptych ha hecho diferente es iterar sobre esa lista.
El método de Triptych funciona porque los elementos del get_rows
list son instancias de la clase Tag de BS;que tiene un findAll
método.
Entonces, para arreglar tu código, puedes reemplazar las últimas tres líneas de tu create
método con algo como esto:
for row in get_rows:
text = ''.join(row.findAll(text=True))
data = text.strip()
print data
Nota para Leonard Richardson:De ninguna manera pretendo degradar la calidad de tu trabajo al referirme a él como una tontería ;-)