2009-06-14 8 views
8

Donc j'apprends Python lentement, et j'essaie de faire une fonction simple qui va tirer des données de la page des meilleurs scores d'un jeu en ligne. C'est le code de quelqu'un d'autre que j'ai réécrit en une seule fonction (ce qui pourrait être le problème), mais je reçois cette erreur. Voici le code:Pourquoi je reçois "'ResultSet' n'a aucun attribut 'findAll'" utilisant 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' 

Merci d'avance.

+0

Pour ce que ça vaut: nommer vos variables "premier", "deuxième", etc. est un style terrible. Vous devriez vraiment être plus descriptif - les noms spécifiques sont à vous, bien sûr, mais je pourrais utiliser "urlcontent", "parser", "mp_tables", et ainsi de suite. –

+0

C'est mon troisième jour avec Python. J'ai besoin de faire ça pour le garder droit dans ma tête. Cela ira mieux au fil du temps ... – Alex

+0

J'ai changé les noms des variables. J'espère que c'est mieux. – Alex

Répondre

19

Wow. Triptych a fourni un great answer à une question connexe.

Nous pouvons voir, from BeautifulSoup's source code, que ResultSet sous-classes list.

Dans votre exemple, get_rows est une instance de classe BS ResultSet,
et depuis ResultSet de BS list sous-classes, cela signifie get_rows est une liste.

get_rows, comme une instance de ResultSet, ne pas disposer d'un procédé mis en œuvre findAll; d'où votre erreur.
Ce que Triptych a fait différemment est de parcourir sur cette liste.
La méthode de Triptych fonctionne parce que les éléments de la liste get_rows sont des instances de la classe Tag de BS; qui a une méthode findAll.

Donc, pour corriger votre code, vous pouvez remplacer les trois dernières lignes de votre méthode create avec quelque chose comme ceci:

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

Note à Leonard Richardson: en aucun cas que je compte rabaisser la qualité de votre travail en le référant comme BS ;-)

+0

Merci pour les cris :) – Triptych

+0

Ne le mentionnez pas: Un excellent travail mérite d'être reconnu! – bernie

+0

'text = true' était exactement ce que je cherchais! –

Questions connexes