2009-06-14 12 views
8

Dlatego uczę się Pythona powoli i staram się wykonać prostą funkcję, która będzie czerpać dane ze strony wyników w grze online. To jest czyjś kod, który przepisałem na jedną funkcję (co może być problemem), ale dostaję ten błąd. Oto kod:Dlaczego otrzymuję "" ResultSet "nie ma atrybutu" findAll "" przy użyciu BeautifulSoup w Pythonie?

>>> 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' 

Z góry dziękuję.

+0

na co warto: nazywania zmiennych „pierwszy”, „drugi”, itd. jest fatalny styl. Naprawdę powinieneś być bardziej opisowy - nazwy oczywiście zależą od ciebie, ale mogę użyć "urlcontent", "parser", "mp_tables" i tak dalej. –

+0

To mój trzeci dzień z Pythonem. Muszę to zrobić, żeby utrzymać to prosto w mojej głowie. Z biegiem czasu będzie coraz lepiej ... – Alex

+0

Zmieniłem nazwy zmiennych. Miej nadzieję, że to jest lepsze. – Alex

Odpowiedz

19

Wow. Tryptyk dostarczył great answer do pokrewnego pytania.

Możemy zobaczyć, from BeautifulSoup's source code, że ResultSet podklasy list.

W przykładzie get_rows jest instancją ResultSet klasy bazowej BS,
a od BS ResultSet podklasy list, czyli get_rows jest lista.

get_rows, jako przykład ResultSet, czy nie mają findAll sposób implementowany; stąd twój błąd.
Co tryptyk zrobił inaczej, to iterować z tej listy.
Metoda tryptyku działa, ponieważ pozycje na liście get_rows są instancjami klasy znaczników BS; który ma metodę findAll.

Tak więc, aby rozwiązać swój kod, można wymienić trzy ostatnie wiersze metodę create z mniej więcej tak:

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

Uwaga dla Leonard Richardson: w żaden sposób nie zamierzam poniżać jakości Twoja praca, odwołując się do niej, jak BS ;-)

+0

Dzięki za krzyk :) – Triptych

+0

Nie wspominaj: wspaniała praca zasługuje na uznanie! – bernie

+0

'text = True' było dokładnie tym, czego szukałem! –

Powiązane problemy