BeautifulSoup und Text innterhalb eines td?

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
würmchen
User
Beiträge: 255
Registriert: Mittwoch 7. November 2007, 14:17

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...
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

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
the more they change the more they stay the same
würmchen
User
Beiträge: 255
Registriert: Mittwoch 7. November 2007, 14:17

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?
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

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'
the more they change the more they stay the same
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

In Deinem Beispiel hat "td" doch auch gar keinen Text-Knoten als Child! Was sollte BS dann auch anzeigen?
würmchen
User
Beiträge: 255
Registriert: Mittwoch 7. November 2007, 14:17

@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?
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

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
the more they change the more they stay the same
würmchen
User
Beiträge: 255
Registriert: Mittwoch 7. November 2007, 14:17

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
Antworten