Hallo,
ich versuche gerade ein „quasi webscraping“ aus gespeicherten html-Dateien zu realisieren.
Normalerweise gehe ich ja so vor, dass ich erst mit
response = requests.get(WEBADRESSE)
die Webseite anfrage, und dann den Inhalt an BeautifulSoup übergebe:
soup = BeautifulSoup(response.content, 'html.parser')
danach ist das Ganze klar. Nur, jetzt muss ich ja gar keine Webseite anfragen, sondern die gespeicherte html-Datei öffnen. Mit dem ganz normalen open kann ich dann nicht den „.content“-Befehl anwenden.
Gibt es eine Möglichkeit die Datei so zu öffnen, dass ich sie an BeautifulSoup übergeben kann?
Oder gehe ich das sowieso falsch an?
LG!
html-Datei auslesen auswerten
Nicht komplett, aber es wirkt auf mich ein bisschen so, als würden vielleicht noch grundlegende Verständnisprobleme insb. im Bereich Datentypen bestehen. Welchen Datentyp hat 'response'? Was ist 'response.content' und welchen Datentyp hat es? Welchen Datentyp hat das Objekt, das open zurückgibt? Und welchen Datentyp erwartet BeautifulSoup? Das kann man zum Beispiel gut mit 'help' und 'type' im interaktiven Interpreter herausfinden; auch 'dir' kann hilfreich sein.
Ja, das es eine Frage des Datentyps ist, war mir schon klar. Die Frage ist ja gerade eben, wie ich die html-Datei in den Datentyp bekomme, dass ich mit BeautifulSoup arbeiten kann...
Sorry, ich formuliere das als absoulter Neuling leider nicht wirklich gut...
Dass ich mir das mit type mal anschaue, wäre wohl naheliegend gewesen - mache ich gleich mal...
Danke
Sorry, ich formuliere das als absoulter Neuling leider nicht wirklich gut...
Dass ich mir das mit type mal anschaue, wäre wohl naheliegend gewesen - mache ich gleich mal...
Danke
Ok, nachdem ich herausgefunden hatte, was BeautifulSoup für einen Datentyp braucht - nämlich String - war es nicht mehr schwer. Folgender Code erzeugt zumindest mal keinen Fehler mehr - bin gespannt, ob die weitere Verarbeitung jetzt wieder wie mit BeautifulSoup gewohnt geht...
Danke noch mal 
Code: Alles auswählen
file = open(FILENAME)
filecontent = datei.read()
soup = BeautifulSoup(str(filecontent), 'html.parser')
datei.close()

- __blackjack__
- User
- Beiträge: 14056
- Registriert: Samstag 2. Juni 2018, 10:21
- Wohnort: 127.0.0.1
- Kontaktdaten:
@Rotmilan: Das dürfte wohl bei der letzten Zeile mit einem `NameError` aussteigen, weil `datei` nicht definiert ist. Dateien sollte man auch besser mit der ``with``-Anweisung verwenden um das schliessen sicherzustellen. Oder man arbeitet mit `pathlib.Path`, das hat Methoden um Dateien komplett zu lesen.
Bei Textdateien sollte man immer explizit eine Kodierung angeben. Was bei beliebigen HTML-Dateien schwierig werden kann, weil die in unterschiedlichen Kodierungen vorliegen können. `Response.content` ist auch gar keine Zeichenkette sondern ein `bytes`-Objekt.
`datei.read()` liefert bereits eine Zeichenkette — es macht keinen Sinn da `str()` mit aufzurufen.
Der Code wäre mit einem `Path`-Objekt nur diese Zeile:
Bei Textdateien sollte man immer explizit eine Kodierung angeben. Was bei beliebigen HTML-Dateien schwierig werden kann, weil die in unterschiedlichen Kodierungen vorliegen können. `Response.content` ist auch gar keine Zeichenkette sondern ein `bytes`-Objekt.
`datei.read()` liefert bereits eine Zeichenkette — es macht keinen Sinn da `str()` mit aufzurufen.
Der Code wäre mit einem `Path`-Objekt nur diese Zeile:
Code: Alles auswählen
soup = BeautifulSoup(FILE_PATH.read_bytes(), "html.parser")
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Sorry, das mit dem datei und file - da hab ich hier noch mal was geändert - sollte man nicht machen

Vielen Dank


Da datei.read() keinen String liefert, dachte ich das müsste so sein - schön zu wissen`datei.read()` liefert bereits eine Zeichenkette — es macht keinen Sinn da `str()` mit aufzurufen.

Das höre ich auch zum ersten malDer Code wäre mit einem `Path`-Objekt nur diese Zeile

Vielen Dank

