Kommentare in HTML finden

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
_nohtyp_
User
Beiträge: 127
Registriert: Mittwoch 8. Januar 2014, 15:38

Ich mache gerade die PyChallenge und versuche, die Quelltext-Kommentare zu finden. Leider finde ich keine Möglichkeit dazu. Bisher habe ich:

Code: Alles auswählen

import urllib.request

f = urllib.request.urlopen("http://www.pythonchallenge.com/pc/def/ocr.html")
html = f.read()

print(html)
BlackJack

@_nohtyp_: Ähm, hast Du Dir den Quelltext von der Webseite einfach mal angeschaut? Da muss man nicht grossartig suchen.
_nohtyp_
User
Beiträge: 127
Registriert: Mittwoch 8. Januar 2014, 15:38

Ja, habe ich mir angeschaut :D Ich würde trotzdem gerne wissen, wie es mit Python gehen würde.
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

@BlackJack: Darum doch auch der Thread Titel ;)

@OP: Entweder du benutzt einen HTML-Parser oder - aber nur, weil der Code nie ernsthaft benutzt werden wird! - du benutzt String Methoden wie `find` und `rfind`.

An den relevanten Text kommst du zB hiermit:

Code: Alles auswählen

import urllib.request
 
f = urllib.request.urlopen("http://www.pythonchallenge.com/pc/def/ocr.html")
s = f.read()
problem = s[s.rfind('<--'):s.rfind('-->')]
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

cofi hat geschrieben:@BlackJack: Darum doch auch der Thread Titel ;)

@OP: Entweder du benutzt einen HTML-Parser oder - aber nur, weil der Code nie ernsthaft benutzt werden wird! - du benutzt String Methoden wie `find` und `rfind`.

An den relevanten Text kommst du zB hiermit:

Code: Alles auswählen

import urllib.request
 
f = urllib.request.urlopen("http://www.pythonchallenge.com/pc/def/ocr.html")
s = f.read().decode('latin1')
problem = s[s.rfind('<!--')+4:s.rfind('-->')]
Edit: Decoding ergaenzt.
_nohtyp_
User
Beiträge: 127
Registriert: Mittwoch 8. Januar 2014, 15:38

Leider erscheint die folgende Fehlermeldung:

Code: Alles auswählen

Traceback (most recent call last):
  File "/Users/***/Desktop/Py_challenge/py.py", line 5, in <module>
    html = s[s.rfind('<--'):s.rfind('-->')]
TypeError: Type str doesn't support the buffer API
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Dann musst du die Bytes eben dekodieren ;)
BlackJack

Die Fehlermeldung verwirrt mich gerade. Es ist laut Fehlermeldung vom Typ `str` also ist es unter Python 3 doch schon dekodiert!?
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

@BlackJack: Da hast du recht, aber das ist tatsaechlich der Grund:

Code: Alles auswählen

>>> f = urllib.request.urlopen('http://www.pythonchallenge.com/pc/def/ocr.html')
>>>s = f.read()
>>> type(s)
<class 'bytes'>
>>> s[s.rfind('<!--')+4:s.rfind('-->')]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: Type str doesn't support the buffer API
Da stimmt wohl was nicht mit der Exception.
BlackJack

@cofi: Ah, wahrscheinlich ist das Problem das hier `bytes.rfind()` eine *Zeichenkette* als Argument übergeben wird. Da muss man sehr wahrscheinlich auch `bytes` übergeben.
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

@BlackJack: Mit einheitlichen `bytes` funktioniert es wieder. Da sieht man mal wieder, dass man keinen Python3 Code in einer Python2 Umgebung schreiben sollte .. und es mit dem Mindset auch nicht "korrigieren" sollte :)
BlackJack

@cofi: Manchmal denke ich ja man sollte einfach gar keinen Python 3-Code schreiben, egal in welcher Umgebung. :twisted:
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Wobei ich das an dieser Stelle schon logisch finde. Wenn man auf Bytes operiert, will man dann wirklich ein implizites Encoding (z.B. von einem String-Literal) haben? Ich denke das bietet viel mehr Fehlerpotenzial, als das es nützt! Insofern ist es doch gut, dass die Methoden wie ``rfind`` bei Bytes *keine* Strings als Argumente entgegen nehmen.

Zudem steht es einem ja frei, *direkt* beim Einlesen die Daten decodieren und dann im Verlauf nur noch mit Strings arbeiten. Dann muss man sich bei den Parametern ja auch keinen Kopf mehr machen...
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Antworten