2009-06-14 10 views
8

Así que estoy aprendiendo Python lentamente, y estoy tratando de hacer una función simple que dibuje datos de la página de puntajes más altos 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 estoy obteniendo este error. Aquí está el código:¿Por qué estoy obteniendo "'ResultSet' no tiene ningún atributo 'findAll'" usando BeautifulSoup en 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' 

Gracias de antemano.

+0

Por lo que vale la pena: nombrar sus variables "primero", "segundo", etc. es un estilo terrible. Deberías ser más descriptivo, los nombres específicos dependen de ti, por supuesto, pero podría usar "urlcontent", "parser", "mp_tables", y así sucesivamente. –

+0

Es mi tercer día con Python. Necesito hacer eso para mantenerlo directo en mi cabeza. Eso mejorará con el tiempo ... – Alex

+0

Cambié los nombres de las variables. Espero que sea mejor. – Alex

Respuesta

19

Wow. Tríptico proporcionó un great answer a una pregunta relacionada.

Podemos ver, from BeautifulSoup's source code, que ResultSet subclases list.

En su ejemplo, get_rows es una instancia de la clase de la BS ResultSet,
y desde ResultSet subclases de BS list, eso significa get_rows es una lista.

get_rows, como una instancia de ResultSet, hace no tienen un método findAll implementado; de ahí tu error
Lo que Triptych ha hecho de manera diferente es iterar sobre esa lista.
El método de Triptych funciona porque los elementos en la lista get_rows son instancias de la clase de etiqueta de BS; que tiene un método findAll.

Por lo tanto, para fijar su código, puede reemplazar las tres últimas líneas de su método de create con algo como esto:

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

Nota a Leonard Richardson: de ninguna manera tengo la intención de degradar la calidad de su trabajo al referirse a él como BS ;-)

+0

Gracias por el saludo :) – Triptych

+0

No lo mencione: ¡Gran trabajo merece reconocimiento! – bernie

+0

'text = True' era justo lo que estaba buscando! –

Cuestiones relacionadas