Hallo,
ich habe da mal eine Frage.
Ich habe ein HTML-Dokument welches ich per BeautifulSoup parse.
Bisher ging alles ganz gut bis jetzt.
Jetzt habe ich eine Stelle die ich per BS nicht extrahieren kann weil 'None-Object' obwhl ich es im Mozilla-'Elementanayser' eindeutig sehe?!?
Ok, dann dachte ich mir geschwind den Quellcode anzeigen lassen und in mein Editor einfügen.
Jetzt steht an der Stelle die ich meine lediglich ein leeres div mit einer ID.
Ganz unten im Quelltext ist aber jetzt ein komisches jQuery welches, nach ein wenig genauerem Hinschauen, die Information steht die ich brauche.
So, kann mir jetzt mal jemand erklären wie ich diese gewünschte Information extrahieren kann?
Kann man jQuerys auslesen? Wieso kann BS nicht den Code auslesen wie es der Firefox-Elementanalyser so zeigt?
Ich denke einfach mal das das jQuery (weiß nichteinmal was das genau ist...) irgendwas 'berechnet' oder 'aufbereitet' und dann fertig in den div-Container einfügt. Das sollte doch aber passieren bevor der HTML-Code an den Brwoser zur ausgabe angelangt (also so wie PHP es z.B. macht), oder?
Was ich damit sagen will: wenn der Browser an der Stelle fertige Elemente erhält, wieso dann BS nicht?
Und wenn das so ist, gibt es eine Möglichkeit diese jQueries auszulesen mit BS?
Ich danke euch schon einmal im Voraus für eure Mühe!
Beautifulsoup jQuery o.ä. extrahieren?
Die Seite verwendet Javascript und verändert den DOM. Beautifulsoup parst nur HTML und ignoriert Javascript, deswegen findest du damit nicht was du willst. Was du machen könntest ist die Seite quasi in einem echten Browser öffnen den du kontrollierst z.B. mit Selenium.
Ich würde allerdings nochmal schauen ob es nicht irgendeinen anderen Weg an die Informationen zu kommen als über die Webseite.
Ich würde allerdings nochmal schauen ob es nicht irgendeinen anderen Weg an die Informationen zu kommen als über die Webseite.
BS ist kein JavaScript-Interpreter. Der Quelltext wird die beim Abrufen der Seite so angezeigt wie der Server ihn ausliefert. Wenn da ein Skript nachträglich den DOM modifiziert, dann würde man in einem Browser die Veränderung sehen, beim Parsen mit BS jedoch nicht.
@kaineanung:
BeautifulSoup parst HTML-Dokumente. Das ist das, was im Browser das initiale DOM aufbaut. JQuery ist Javascript, womit man das initialisierte DOM zur Laufzeit manipulieren kann (Elemente hinzufügen, editieren, entfernen). Daher siehst Du das nicht direkt im HTML, sondern entweder in <script>-Tags oder in zusätzlich eingebundenen JS-Dateien.
Daher sind diese Änderungen am DOM nicht für reine HTML-Parser sichtbar, hierfür brauchst Du eine vollwertige Browserkomponente, welche auch Javascript (und CSS) auswertet.
Edit: Oh Mann, zu spät
BeautifulSoup parst HTML-Dokumente. Das ist das, was im Browser das initiale DOM aufbaut. JQuery ist Javascript, womit man das initialisierte DOM zur Laufzeit manipulieren kann (Elemente hinzufügen, editieren, entfernen). Daher siehst Du das nicht direkt im HTML, sondern entweder in <script>-Tags oder in zusätzlich eingebundenen JS-Dateien.
Daher sind diese Änderungen am DOM nicht für reine HTML-Parser sichtbar, hierfür brauchst Du eine vollwertige Browserkomponente, welche auch Javascript (und CSS) auswertet.
Edit: Oh Mann, zu spät
-
BlackJack
@kaineanung: Um es nochmal explizit zu sagen: jQuery ist eine JavaScript-Bibliothek um leichter und browserübergreifend das HTML-Dokument manipulieren zu können. JavaScript-Code in Webseiten wird eben nicht wie PHP auf der Serverseite ausgeführt sondern im Client, also in Deinem Webbrowser.
Das die Daten im JavaScript stehen ist eigentlich eher selten. Normalerweise macht man mit JavaScript weitere Anfragen an den Server und erstellt dann auf Browserseite die Darstellung. Kann also gut möglich sein, dass die Information die Du vermisst, über eine weitere Abfrage vom Server kommt. Schau Dir mal die komplette Kommunikation zwischen Browser und Server an wenn die fragliche Seite aufgebaut wird.
Das die Daten im JavaScript stehen ist eigentlich eher selten. Normalerweise macht man mit JavaScript weitere Anfragen an den Server und erstellt dann auf Browserseite die Darstellung. Kann also gut möglich sein, dass die Information die Du vermisst, über eine weitere Abfrage vom Server kommt. Schau Dir mal die komplette Kommunikation zwischen Browser und Server an wenn die fragliche Seite aufgebaut wird.
-
kaineanung
- User
- Beiträge: 145
- Registriert: Sonntag 5. April 2015, 20:57
Wenn ich mir den Quelltext in meinen Texteditor kopiere, dann sehe ich im Fuß die entsprechende JQuery in welcher ich die benötigten Infos parsen könnte (weil die sind da hinterlegt -> notfalls per Stringfunktionen statt BS).
Die Frage ist: komme ich mit BS an diese Stelle heran?
Wenn ich das aber gerade so schreibe, kommt mir die Idee eben nicht BS zu verwenden sondern tatsächlich Stringfunktionen auf das geladene html-Dokument, welches sind in einer Stringvariable befindet, anzuwenden.
Ich habe mir die Stringvariable jetzt noch nicht angeschaut weil ich diese normalerweise direkt an BS weiterreiche. Aber der Inhalt sollte doch 1:1 so drinnen stehen wie ich es auch in meinem Texteditor sehe wenn ich den Seitenquellcode aus dem Browser kopiere und dort einfüge, richtig?
Wenn dem so ist, dann habe ich natürlich nicht die 'Komfort'-Funktionen von BS, aber mit ein wenig suchen der Strings mit den Stringfunktionen sollte ich an die Informationen herankommen können, nicht wahr?
Oder besteht die Gefahr das diese html-Variable, welche ich per urllib2 befülle, diese Stellen eines jQueries nicht beinhaltet? Eher unwahrscheinlich, oder?
Die Frage ist: komme ich mit BS an diese Stelle heran?
Wenn ich das aber gerade so schreibe, kommt mir die Idee eben nicht BS zu verwenden sondern tatsächlich Stringfunktionen auf das geladene html-Dokument, welches sind in einer Stringvariable befindet, anzuwenden.
Ich habe mir die Stringvariable jetzt noch nicht angeschaut weil ich diese normalerweise direkt an BS weiterreiche. Aber der Inhalt sollte doch 1:1 so drinnen stehen wie ich es auch in meinem Texteditor sehe wenn ich den Seitenquellcode aus dem Browser kopiere und dort einfüge, richtig?
Wenn dem so ist, dann habe ich natürlich nicht die 'Komfort'-Funktionen von BS, aber mit ein wenig suchen der Strings mit den Stringfunktionen sollte ich an die Informationen herankommen können, nicht wahr?
Oder besteht die Gefahr das diese html-Variable, welche ich per urllib2 befülle, diese Stellen eines jQueries nicht beinhaltet? Eher unwahrscheinlich, oder?
@kaineanung: es ist komisch, dass im JavaScript exakt das steht, was dann ins DOM kommt. Warum sollte man einen konstanten Text dynamisch schreiben? Auf jeden Fall solltest Du das <script>-Tag per BS suchen. Wie Du dann das JavaScript parst, bleibt aber dann an Dir hängen.
Schau dir mal slimit an:
SlimIt is a JavaScript minifier written in Python. It compiles JavaScript into more compact code so that it downloads and runs faster.
SlimIt also provides a library that includes a JavaScript parser, lexer, pretty printer and a tree visitor.
-
kaineanung
- User
- Beiträge: 145
- Registriert: Sonntag 5. April 2015, 20:57
Ja, das werde ich so machen. Per BS den Script-Tag am Fußende auslesen und da drinnen dann per String-Funktionen nach entsprechender Stelle suchen.
Und warum diese Jungs das so machen daß Sie die Informationen irgendwo als Parameter dann speichern um anschliessend dann per jQuery das an entsprechender Stelle anzuzeigen -> keine Ahnung. Jedenfalls habe ich es noch einmal gegengeprüft und es ist tatsächlich so....
Aber diese Information wird in einer Art Diagramm angezeigt und wahrscheinlich nutzen die das Java-Script lediglich für diese 'grafische' Aufbereitung und brauchen eben Java-Script dafür.... also geht es nicht darum Informationen irgendo zu ermitteln um sie dann einzufügen sondern um das Diagramm aufzubereiten und es dann anzeigen zu lassen?
Davon gehe ich jetzt mal aus. Hauptsache ich bekomme meine Werte..... und morgen bastle ich weiter an meinem 'Jetzt lerne ich Python'-Projekt...
Und warum diese Jungs das so machen daß Sie die Informationen irgendwo als Parameter dann speichern um anschliessend dann per jQuery das an entsprechender Stelle anzuzeigen -> keine Ahnung. Jedenfalls habe ich es noch einmal gegengeprüft und es ist tatsächlich so....
Aber diese Information wird in einer Art Diagramm angezeigt und wahrscheinlich nutzen die das Java-Script lediglich für diese 'grafische' Aufbereitung und brauchen eben Java-Script dafür.... also geht es nicht darum Informationen irgendo zu ermitteln um sie dann einzufügen sondern um das Diagramm aufzubereiten und es dann anzeigen zu lassen?
Davon gehe ich jetzt mal aus. Hauptsache ich bekomme meine Werte..... und morgen bastle ich weiter an meinem 'Jetzt lerne ich Python'-Projekt...
-
kaineanung
- User
- Beiträge: 145
- Registriert: Sonntag 5. April 2015, 20:57
So, jetzt habe ich alle Script-Tags extrahiert und eins nach dem anderen kontrolliert.
Bis auf das letzte gewünschte Element habe ich alle gefunden. Aber gerade das letzte Element ist das was ich brauche und das finde ist fedinitiv in BS nicht vorhanden?!?
Ich habe die Seite natürlich auch auf die Festplatte heruntergeladen und den Quellcode anzeigen lassen. Der ist da nach wie vor enthalten und zwar genau mit der Information die ich eigentlich haben will.
Wenn ich die Seite von der Festplatte aufrufe wird das Diagramm (darum geht es an dieser betreffenden Stelle) kurz angezeigt im Browser und verschwindet plötzlich wieder?
Wie kann das sein? Und wieso schafft BS dieses Tag nicht zu erkennen obwohl es im Quellcode (auch offline) sichtbar ist? Im Texteditor ist es definitiv da.
Was kann ich machen um BS zu überreden mir das Tag anzubieten? Und wenn das nicht geht, was wäre die Alternative?
Der Inhalt der mich interessiert steht als Parameter in einem jQuery wie das hier:
Welches wiederrum in einem übergeordneten Script-Tag steht...
Die anderen jQueries finde ich aber im gleichen Script-Tag die sich lediglich dadurch unterscheiden das diese statt jQuery(windows) ein jQuery('body') enthalten.
Bis auf das letzte gewünschte Element habe ich alle gefunden. Aber gerade das letzte Element ist das was ich brauche und das finde ist fedinitiv in BS nicht vorhanden?!?
Ich habe die Seite natürlich auch auf die Festplatte heruntergeladen und den Quellcode anzeigen lassen. Der ist da nach wie vor enthalten und zwar genau mit der Information die ich eigentlich haben will.
Wenn ich die Seite von der Festplatte aufrufe wird das Diagramm (darum geht es an dieser betreffenden Stelle) kurz angezeigt im Browser und verschwindet plötzlich wieder?
Wie kann das sein? Und wieso schafft BS dieses Tag nicht zu erkennen obwohl es im Quellcode (auch offline) sichtbar ist? Im Texteditor ist es definitiv da.
Was kann ich machen um BS zu überreden mir das Tag anzubieten? Und wenn das nicht geht, was wäre die Alternative?
Der Inhalt der mich interessiert steht als Parameter in einem jQuery wie das hier:
Code: Alles auswählen
jQuery(window).on('load',function() { .... })
Die anderen jQueries finde ich aber im gleichen Script-Tag die sich lediglich dadurch unterscheiden das diese statt jQuery(windows) ein jQuery('body') enthalten.
-
kaineanung
- User
- Beiträge: 145
- Registriert: Sonntag 5. April 2015, 20:57
Hallo Leute,
nach einer Mehrmonaten Pause vom privaten programmieren und programmieren an anderen 'Python-Projekten' (mittlerweile auch im Geschäft
) bin ich wieder zu meinem liebgewonnen privaten Pythonprojekt zurückgekommen.
Und da bin ich wieder am gleichen Problem wie damals:
wie Daten aus jQuery parsen?
Ich habe ein wenig gegoogelt und bestimmt 3 verschiedene Ansätze gefunden beim überfliegen. der eine sagt pyQuery, der andere sagt Requests und der dritte wiederrum was ganz anderes.
Daher frage ich lieber nochmals hier nach und weiß daß ich in guten Händen bin.
Gibt es eine Bibliothek die ich einbinden kann welche mir dann jQuery-Daten auslesen kann? Und wenn ja, wo gibt es Anleitungen dazu oder noch besser ein Tutorial zum erlernen dieser 'Technik'?
Oder vielleicht ganz andere Vorschläge?
Ich bin für jeden Hinweis derm ich weiterbringt sehr dankbar. Durch euch habe ich python überhaupt erst für mich entdeckt und bin gar nicht mal schlecht geworden damit...
nach einer Mehrmonaten Pause vom privaten programmieren und programmieren an anderen 'Python-Projekten' (mittlerweile auch im Geschäft
Und da bin ich wieder am gleichen Problem wie damals:
wie Daten aus jQuery parsen?
Ich habe ein wenig gegoogelt und bestimmt 3 verschiedene Ansätze gefunden beim überfliegen. der eine sagt pyQuery, der andere sagt Requests und der dritte wiederrum was ganz anderes.
Daher frage ich lieber nochmals hier nach und weiß daß ich in guten Händen bin.
Gibt es eine Bibliothek die ich einbinden kann welche mir dann jQuery-Daten auslesen kann? Und wenn ja, wo gibt es Anleitungen dazu oder noch besser ein Tutorial zum erlernen dieser 'Technik'?
Oder vielleicht ganz andere Vorschläge?
Ich bin für jeden Hinweis derm ich weiterbringt sehr dankbar. Durch euch habe ich python überhaupt erst für mich entdeckt und bin gar nicht mal schlecht geworden damit...
-
BlackJack
@kaineanung: „Daten aus jQuery parsen“ ist ein Satz der keinen Sinn macht. Es wurde doch bereits geschrieben das jQuery ein *Bibliothek* ist.
Du musst jetzt erst einmal klären wie die Daten denn nun tatsächlich in die Webseite kommen. Ist das JavaScript das im HTML eingebettet ist und die Daten bereits enthält, oder werden die Daten per JavaScript in zusätzlichen Abfragen an den Webserver geholt und dann dynamisch in die Webseite eingebaut?
Du musst jetzt erst einmal klären wie die Daten denn nun tatsächlich in die Webseite kommen. Ist das JavaScript das im HTML eingebettet ist und die Daten bereits enthält, oder werden die Daten per JavaScript in zusätzlichen Abfragen an den Webserver geholt und dann dynamisch in die Webseite eingebaut?
-
kaineanung
- User
- Beiträge: 145
- Registriert: Sonntag 5. April 2015, 20:57
@BlackJack
Und ein weiterer Anlauf bezüglich dieser Sache (war zwischenzeitig auch mal im Urlaub und jetzt will ich wieder voll durchstartetn mit meinen Trainigsprojekt).
Ich habe mir die Seite ein wenig angeschaut und im Fuß der HTML-Quelldatei stehen tatsächlich 2 Javascripte. Eines davon ist mir an sicherheit grenzender Wahrscheinlichkeit das welches die Daten holt und bereitstellt.
Ich habe zwar keinen Durchblick wie, wo und wann er das macht, aber im Endergebnis stehen die Daten auf der Seite und im Quelltext sind sie nicht vorhanden. Ergo: es kann nur das sein.
So, jetzt würde ich gerne diese Daten anzapfen wollen können. Welchen Ansatz sollte ich da befolgen?
Und ein weiterer Anlauf bezüglich dieser Sache (war zwischenzeitig auch mal im Urlaub und jetzt will ich wieder voll durchstartetn mit meinen Trainigsprojekt).
Ich habe mir die Seite ein wenig angeschaut und im Fuß der HTML-Quelldatei stehen tatsächlich 2 Javascripte. Eines davon ist mir an sicherheit grenzender Wahrscheinlichkeit das welches die Daten holt und bereitstellt.
Ich habe zwar keinen Durchblick wie, wo und wann er das macht, aber im Endergebnis stehen die Daten auf der Seite und im Quelltext sind sie nicht vorhanden. Ergo: es kann nur das sein.
So, jetzt würde ich gerne diese Daten anzapfen wollen können. Welchen Ansatz sollte ich da befolgen?
-
BlackJack
@kaineanung: Ich würde mir in so einem Fall die Kommunikation zwischen dem JavaScript und dem Webserver anschauen. Dann sieht man ja wie die Daten abgefragt und ausgeliefert werden, und kann das nachbauen.
