Warum bekomme ich "Ergebnisset" mit BeautifulSoup in Python kein Attribut "Findall"?
-
13-09-2019 - |
Frage
Ich lerne also langsam Python und versuche, eine einfache Funktion zu erstellen, die Daten aus der Seite mit hohen Ergebnissen eines Online -Spiels zeichnet. Dies ist der Code eines anderen, den ich in eine Funktion umgewandelt habe (was das Problem sein könnte), aber ich erhalte diesen Fehler. Hier ist der Code:
>>> 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'
Danke im Voraus.
Lösung
Wow. Triptychon lieferte a Großartig Antworten zu einer verwandten Frage.
Wir sehen, aus dem Quellcode von BeautifulSoup, das ResultSet
Unterklassen list
.
In Ihrem Beispiel, get_rows
ist eine Instanz von BSs ResultSet
Klasse,
und seit BS's ResultSet
Unterklassen list
, das bedeutet get_rows ist eine Liste.
get_rows
, als Instanz von ResultSet
, tut nicht haben eine findAll
Methode implementiert; Daher Ihr Fehler.
Was Triptychon anders getan hat, ist iterieren über diese Liste.
Die Methode von Triptychon funktioniert, weil die Elemente in der get_rows
Liste sind Fälle von BS 'Tag -Klasse; was hat a findAll
Methode.
Um Ihren Code zu beheben, können Sie die letzten drei Zeilen Ihrer ersetzen create
Methode mit so etwas:
for row in get_rows:
text = ''.join(row.findAll(text=True))
data = text.strip()
print data
Hinweis an Leonard Richardson: In keiner Weise beabsichtige ich, die Qualität Ihrer Arbeit zu erniedrigen, indem ich sie als BS bezeichne ;-)