Seite 1 von 1
BeautifulSoup und Text innterhalb eines td?
Verfasst: Donnerstag 8. Oktober 2009, 14:18
von würmchen
Hallo Leute, ich hab gerade ein Problem, dass ich an Text innerhalb eines <td>s nicht ran komme. Bin da noch recht neu drin, aber mein erwartetes .string geht da irgendwie nicht.
Code: Alles auswählen
<td>
<a href="/scripts/mgrqispi.dll?APPNAME=CampusNet&PRGNAME=COURSEDETAILS&ARGUMENTS=-N000000000000001,-N000516,-N0,-N334933826161486,-N334933826181487,-N0,-N0,-N0" name="eventLink">09.032.1060 Vorlesung: Chemie für Biologen</a><br/>
Univ.-Prof. Dr. Holger Frey
<br/>
Mi, 28. Okt. 2009 [08:00] - Do, 11. Feb. 2010 [08:00]
</td>
Das ist der HTML den ich hab und ich brauch da jetzt, neben den Text in <a> auch eben noch Univ.-Prof. Dr. .... usw....
Kleines Beispiel was ich meine:
Code: Alles auswählen
soup = BeautifulSoup('<td>test</td>')
print soup.string
# None
Das das da oben kein schönes HTML ist und eigentlich in ein <p> gehört, weiß ich auch, nur is es im Moment nicht so...
Wäre für Ideen dankbar...
Verfasst: Donnerstag 8. Oktober 2009, 14:37
von Dav1d
Code: Alles auswählen
>>> from BeautifulSoup import BeautifulSoup
>>> soup = BeautifulSoup('<td>test</td>')
>>> soup.find('td', text=True)
u'test'
Falls du sie nicht gefunden hast, heri die Doku (eine der wenigen die richtig gut ist):
http://www.crummy.com/software/Beautifu ... ation.html
Verfasst: Donnerstag 8. Oktober 2009, 14:49
von würmchen
Doch, die Doku hab ich gefunden. Muss aber zugeben, dass ich dieses Beispiel mit dem text=True nicht bemerkt habe... Aber komisch ist, für mein Beispiel geht es nicht...
Code: Alles auswählen
>>> i = '''<td>
... <a href="/scripts/mgrqispi.dll?APPNAME=CampusNet&PRGNAME=COURSEDETAILS&ARGUMENTS=-N000000000000001,-N000516,-N0,-N334933826161486,-N334933826181487,-N0,-N0,-N0" name="eventLink">09.032.1060 Vorlesung: Chemie für Biologen</a><br/>
... Univ.-Prof. Dr. Holger Frey
... <br/>
... Mi, 28. Okt. 2009 [08:00] - Do, 11. Feb. 2010 [08:00]
... </td>'''
>>> i
'<td>\n <a href="/scripts/mgrqispi.dll?APPNAME=CampusNet&PRGNAME=COURSEDETAILS&ARGUMENTS=-N000000000000001,-N000516,-N0,-N334933826161486,-N334933826181487,-N0,-N0,-N0" name="eventLink">09.032.1060 Vorlesung: Chemie f\xc3\xbcr Biologen</a><br/>\n Univ.-Prof. Dr. Holger Frey\n <br/>\n Mi, 28. Okt. 2009 [08:00] - Do, 11. Feb. 2010 [08:00]\n </td>'
>>> soup = BeautifulSoup(i)
>>> soup.find('td', text=True)
u'\n'
Mach ich gerade was falsch?
Verfasst: Donnerstag 8. Oktober 2009, 15:00
von Dav1d
FindAll ist das Zauberwort:
Code: Alles auswählen
>>> from BeautifulSoup import BeautifulSoup
>>> f = '''<td>
<a href="/scripts/mgrqispi.dll?APPNAME=CampusNet&PRGNAME=COURSEDETAILS&ARGUMENTS=-N000000000000001,-N000516,-N0,-N334933826161486,-N334933826181487,-N0,-N0,-N0" name="eventLink">09.032.1060 Vorlesung: Chemie für Biologen</a><br/>
Univ.-Prof. Dr. Holger Frey
<br/>
Mi, 28. Okt. 2009 [08:00] - Do, 11. Feb. 2010 [08:00]
</td>
'''
>>> soup = BeautifulSoup(f)
>>> td = soup.find('td', text=True)
>>> td
u'\n'
>>> td = soup.findAll('td', text=True)
>>> td
[u'\n', u'09.032.1060 Vorlesung: Chemie f\xfcr Biologen', u'\n Univ.-Prof. Dr. Holger Frey\n ', u'\n Mi, 28. Okt. 2009 [08:00] - Do, 11. Feb. 2010 [08:00]\n ', u'\n']
>>> td = ''.join(td)
>>> td
u'\n09.032.1060 Vorlesung: Chemie f\xfcr Biologen\n Univ.-Prof. Dr. Holger Frey\n \n Mi, 28. Okt. 2009 [08:00] - Do, 11. Feb. 2010 [08:00]\n \n'
Verfasst: Donnerstag 8. Oktober 2009, 15:02
von Hyperion
In Deinem Beispiel hat "td" doch auch gar keinen Text-Knoten als Child! Was sollte BS dann auch anzeigen?
Verfasst: Donnerstag 8. Oktober 2009, 15:06
von würmchen
@Hyperion
Gutes Argument, ich hatte erwartet das es dann einfach den Inhalt ausgibt. Ich werde die Anleitung genauer studieren, hab vor 2 Stunden das erste mal mit BeutifulSoap angefangen... Trotzdem Danke
Ok, super, das klappt, aber verstehen tu ich das an der Stelle nicht so ganz... Der macht dann bei jedem \n ein neues Element oder wie?
Verfasst: Donnerstag 8. Oktober 2009, 15:12
von Hyperion
Aus der Doku zu find():
BS Doku hat geschrieben:
The find method is almost exactly like findAll, except that instead of finding all the matching objects, it only finds the first one. It's like imposing a limit of 1 on the result set, and then extracting the single result from the array
Du hast eben nur den ersten Text-Knoten gefunden, der ist eben nur der "\n" (wußte nicht, das BS auch White-Spaces mitberücksichtigt). Mit findAll() kannst Du eben auch alle anderen finden, die durch andere HTML-Knoten unterbrochen sind:
Code: Alles auswählen
<td>
text1
<a>
text2
text3
# mit findAll():
text1 und text3
# mit find()
text1
Verfasst: Donnerstag 8. Oktober 2009, 15:19
von Dav1d
Nein der Quelltext geordnet:
Code: Alles auswählen
<td>
<a href="/scripts/mgrqispi.dll">09.032.1060 Vorlesung: Chemie für Biologen</a>
<br/>Univ.-Prof. Dr. Holger Frey
<br/>Mi, 28. Okt. 2009 [08:00] - Do, 11. Feb. 2010 [08:00]
</td>
<td> enthält keinen Text auser ein \n bis zum Link (<a>) das wird von soup.find gefunden!
Code: Alles auswählen
>>> g = '''<td>hallo<a asfdsf>dfsdf</a>weiter gehts</td>'''
>>> soup = BeautifulSoup(g)
>>> soup.find('td', text=True)
u'hallo'
>>> soup.findAll('td', text=True)
[u'hallo', u'dfsdf', u'weiter gehts']
FindAll finde alles, auch den Text vom Link also alles was vom td-Container umschlossen wird!
//Edit: grr 7min zu langsam
Verfasst: Donnerstag 8. Oktober 2009, 15:22
von würmchen
Ok, dann ist es verständlich. Hatte irgendwie nicht mit find und findAll gearbeitet weil bei den ersten paar Versuchen ein soup('a') oder so immer gereicht hatte... Aber jetzt ist mir der Unterschied klar...
Danke