¿Por qué obtengo "'ResultSet' no tiene el atributo 'findAll'" usando BeautifulSoup en Python?

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

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

¿Fue útil?

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top