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.
@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`.
import urllib.request
f = urllib.request.urlopen("http://www.pythonchallenge.com/pc/def/ocr.html")
s = f.read()
problem = s[s.rfind('<--'):s.rfind('-->')]
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`.
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('-->')]
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
>>> 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
@cofi: Ah, wahrscheinlich ist das Problem das hier `bytes.rfind()` eine *Zeichenkette* als Argument übergeben wird. Da muss man sehr wahrscheinlich auch `bytes` übergeben.
@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
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...