HTML-Quelltext unterschiedlich in Browser im Gegensatz zu requests

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
osys
User
Beiträge: 9
Registriert: Dienstag 4. August 2015, 18:14

Hallo liebe Leute im Forum,

ich habe gerade echtes kopfkratzen. Ich wollte den Code vom Modul pytube verstehen. Klappte auch soweit. Habe eine eigene Variante in BeautifulSoup programmieren können. Nur eine Sache will mir nicht in den Kopf:

> Der Quellcode, der Website, welchen ich via requests herunterlade ist der selbe wie im Browser (Firefox/Chrome).
> Nutze ich doc = BeautifulSoup("Youtubelink","html.parser") dann kommt ganz anderer Quelltext bei raus. Ist richtig soweit, denn die Webseite wurde ja nun geparst, also "alle Skripte" ausgeführt und das Endresultat wird präsentiert.

Nun habe ich aber folgenden Error im Kopf:

Wieso gibt mir der Browser, welcher die Webseite ebenso parst, keinen geparsten Quelltext aus, unter "Seitenquelltext anzeigen"?
Wenn ich mit "Untersuchen" den Quelltext durchgehe, habe ich wieder einen anderen Quelltext. Ich merke dies daran, dass ich folgende CSS Klasse (.pl-video-title-link) via Python finde, soweit geparst, in beiden Browsern jedoch nie zu Gesicht bekomme.

Wieso ist das so!?

Mein Mini-Code-Schnipsel:

Code: Alles auswählen

from bs4 import BeautifulSoup as beb
import requests
r = requests.Session()
site = r.get("https://www.youtube.com/playlist?list=UULGY6_j7kZfA1dmmjR1J_7w", allow_redirects=False)

doc = beb(site.text, "html.parser")
print(doc)
Dies habe ich ausschließlich zum Verstehen nachprogrammiert und erhalte, selbst wenn ich den Code-Schnipsel von pytube ausführe, das selbe Ergebnis - was an sich Top ist. Nur scheinen die Quelltexte unterschiedliche zu sein, von beiden Parsern (BeautifulSoup & pytube(urllib)) zum normalen Browser.

Wieso ist das so?
Wie kann ich es erreichen, den Quelltext aus pytube, BeautifulSoup auch im Browser zu sehen? <-- Hauptfrage für mich. 8)

Danke euch.

P.S.: Kann es vielleicht auch sein, dass im Parser bei Python die "on-click" JavaSkripte direkt ausgeführt werden und er quasi klickt und daher ein anderer Quelltext herauskommt!? *kopfkratz* :shock:
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@osys: Der Parser führt kein JavaScript aus. Der Browser aber. Ausserdem verhinderst Du aktiv das `requests` Umleitungen folgt — was der Browser aber tut. Das wären schon mal zwei Stellen an denen sich das Python-Programm und der Browser unterscheiden.

Abkürzungen sind übrigens nicht gut. Das `beb` für `BeautifulSoup` stehen soll, ist alles, aber nicht offensichtlich. Und warum `r` für ein `Session`-Objekt stehen soll, ist mir auch nicht ersichtlich.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
osys
User
Beiträge: 9
Registriert: Dienstag 4. August 2015, 18:14

Danke Die Blackjack für deine Antwort.

Ich habe den Parameter (allow_redirects=False) auf (allow_redirects=True) gesetzt und gleichzeitig im Firefox über "about:config" javascript.enable auf "False" gesetzt. Dann erneut verglichen und es stimmt wieder nicht. Ich bin am verzweifeln, denn bis dato stimmten die abgerufenen Seiten immer mit den Python-Html-Parsern überein.

Gibt es eine weitere Idee?
Der BeautifulSoup, sowie der urllib HTML-Parser, mimt ja quasi einen Browser. Daher waren bis dato auch immer alle Seiten gleich. On.Click wird auch nur On.Click ausgeführt, also warten BeautifulSoup und requests, bis sie auch klicken sollen. Diese Events werden also nicht gecalled. Daher kann keine Code-Veränderung stammen, wie ich im vorherigen Post im "P.S.:" vermutete. Ich bin mega ratlos.

P.S.: Danke Dir für den Tipp mit den Abkürzungen. Ich schreibe zwar nur privat für mich, gebe Dir aber vollkommen recht, dass ich mit Sicherheit nach 6 Monaten erst einmal wieder ewig lesen und scrollen muss, um den Code zu verstehen... Werde ich in Zukunft anders handhaben.
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

Weder BeautifulSoup noch der bei Python mitgelieferte HTML-Parser mimen einen Browser, sie parsen einfach nur das HTML. Und daher warte auch niemand auf irgendwelche Klicks. Wenn Du bei Firefox Javascript ausgeschaltet hast, sollte zumindest das HTML identisch sein. Kannst Du mal ein Beispiel geben, was Du erwartest und was Du bekommst?
Antworten