Bestimmten Bereich aus HTML auslesen?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Echoplex
User
Beiträge: 6
Registriert: Sonntag 29. März 2009, 11:18

Sonntag 29. März 2009, 11:32

Hi,

hab ein kleines Problem, ich lade mir per urllib eine Webseite in eine Textdatei, in dieser Textdatei soll alles gelöscht werden bis auf den Bereich von <textarea> bis </textarea>!
Welchen Befehl brauch ich?
Hab mir schon mal re angeschaut, aber da finde ich nichts passendes?!

MfG
Benutzeravatar
cofi
Moderator
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Sonntag 29. März 2009, 11:43

Was du willst ist ein HTML Parser.
* BeautifulSoup
* lxml.html
* ....
Dauerbaustelle
User
Beiträge: 996
Registriert: Mittwoch 9. Januar 2008, 13:48

Sonntag 29. März 2009, 12:08

Code: Alles auswählen

import re
re.findall('<textarea.+?>.+?</textarea>', deinhtml)
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Sonntag 29. März 2009, 12:18

Was wäre wenn jemand ``<TEXTAREA>`` schreibt? Das wäre immer noch gültiges HTML.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Dauerbaustelle
User
Beiträge: 996
Registriert: Mittwoch 9. Januar 2008, 13:48

Sonntag 29. März 2009, 12:20

Das hat er aber nicht erzählt :P
Echoplex
User
Beiträge: 6
Registriert: Sonntag 29. März 2009, 11:18

Sonntag 29. März 2009, 13:16

@Leonidas
Das wär erst mal egal :wink:

@Dauerbaustelle, cofi
Danke, aber ich bekomm (re.findall) immer folgenden Error:
Traceback (most recent call last):
File "", line 22, in onOeffnen
re.findall('<textarea.+?>.+?</textarea>', liste)
File "", line 175, in findall
return _compile(pattern, flags).findall(string)
TypeError: expected string or buffer
Traceback (most recent call last):
File ", line 22, in onOeffnen
re.findall('<textarea.+?>.+?</textarea>', liste)
File "", line 175, in findall
return _compile(pattern, flags).findall(string)
TypeError: expected string or buffer
Hier der Code:
http://codepad.org/AQ0knMBO
http://codepad.org/BCFsUQdD

(Da geht noch einiges net, aber mir geht es erstmal um die geposteten Fehler!)

MfG
lunar

Sonntag 29. März 2009, 13:24

Dauerbaustelle hat geschrieben:Das hat er aber nicht erzählt :P
Das macht die Verwendung regulärer Ausdrücke nicht besser ... ;)

@Echoplex
Ich würde dir raten, das Programm erstmal ohne GUI umzusetzen. Dein Code enthält nämlich noch einige Fehler, die mich vermuten lassen, dass du dich mit Python noch nicht gut genug auskennst, um vernünftigen GUI-Code programmieren zu können.

Zum einen ist dir offenbar nicht mal bewusst, dass ein Methodenaufruf Klammern erfordert. An zwei Stellen hast du diese nämlich vergessen, weder "DLListe.clear()" noch "datei.close()" werden aufgerufen. Letzteres führt zum nächsten Punkt: Fehlende Ausnahmebehandlung. Tritt ein Fehler auf, so wird die Datei nicht korrekt geschlossen.

Der Fehler bei ".findall" ist ein Typfehler. Die Funktion erwartet eine Zeichenkette, du aber übergibst ein Datei-ähnliches Objekt, welches von "urllib2.urlopen" zurückgegeben wurde.

Ich denke, du solltest dir erstmal sowohl das Python-Tutorial als auch die Dokumentation der verwendeten Funktionen genau durchlesen sowie den interaktiven Interpreter kennen lernen, bevor du dich an eine GUI oder etwas komplexere Aufgaben wie HTML-Parsing wagst. Momentan sieht das nämlich alles mehr nach "Programming by accident" als nach einem gut überlegten, durchdachten Lösungsansatz aus. Nichts für ungut ...
Benutzeravatar
cofi
Moderator
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Sonntag 29. März 2009, 13:26

Was urlopen zurückliefert, ist nunmal kein String.
Versuch mal das in einen String zu konvertieren -> `str(urlopen(...))' bzw
`urlopen(...).decode(insert_codec_here)'
Ersteres wenn es nur ASCII ist, letzteres wenn du Sonderzeichen hast.

P.S. Etwas das keine Liste ist `liste' zu nennen ist ziemlich verwirrend.
lunar

Sonntag 29. März 2009, 13:35

Danke für die Steilvorlage ...

Genau das meine ich mit "programming by accident": Einfach mal ohne Sinn und Verstand wild drauflos probierend und mal irgendwas "versuchen", anstatt die Dokumentation zu lesen und anschließend zu überlegen, was "file-like object" bedeutet und wie man daraus eine Zeichenkette extrahiert ... :roll:
Echoplex
User
Beiträge: 6
Registriert: Sonntag 29. März 2009, 11:18

Sonntag 29. März 2009, 13:48

Kenne Qt halt schon von C++, da hab ich mir halt gedacht ich könnte es gleich verwenden :?
Okay, werd mal versuchen das ganz in der Konsole umzusetzen!

MfG
Dauerbaustelle
User
Beiträge: 996
Registriert: Mittwoch 9. Januar 2008, 13:48

Sonntag 29. März 2009, 14:09

@lunar: Ich denke, man kann sich das Zeugs auch aneignen, wenn man überhaupt keine Erfahrung hat, ich zB habe einfach mit einem GTK2-Tutorial auf Englisch angefangen und die Codeschnipsel abgeschrieben und kanns heute trotzdem...
lunar

Sonntag 29. März 2009, 14:10

Echoplex hat geschrieben:Kenne Qt halt schon von C++, da hab ich mir halt gedacht ich könnte es gleich verwenden :?
Ich habe nichts gegen die Wahl von Qt, im Gegenteil, für GUIs ist das meiner Meinung nach die beste Wahl ;) Wenn du mit GUI-Entwicklung besser zurecht kommst, dann wäre es auch falsch, etwas anderes zu tun.

Allerdings zeigt dein Code eben, dass dir noch ein paar Python-Grundlagen fehlen. Meiner Erfahrung nach lernt man die besser, wenn man sich erstmal auf die Sprache selbst konzentriert anstatt nebenbei auch noch mit dem GUI-Framework zu arbeiten. Das geht dann halt am besten in einer einfachen Konsolenanwendung.

Zudem ist es nicht schwer, eine GUI zu implementieren, wenn man die Logik gut gekapselt hat.
Antworten