Ich lerne und arbeite in Python 3.7.

Soweit ich weiß, soll die Suchfunktion eine Indexposition eines Strings angeben.

Es tut genau das, wenn meine Eingabe eine gerade Zeichenfolge ist

myString='Blabla<body>blabla'.

Jetzt

myString.find('<body>')

Gibt 6. Super zurück. Aber wenn ich die Zeichenfolge von einer Webseite importiere, wird der Fehler angezeigt

TypeError: argument should be integer or bytes-like object, not 'str'

Ich konnte nicht mehr zustimmen, aber ich verstehe nicht, warum das Argument überhaupt str ist.

Mein Code:

import ssl, urllib.request
url = 'http://help.websiteos.com/websiteos/example_of_a_simple_html_page.htm'

response = urllib.request.urlopen(url)
Content = response.read()
startposition = Content.find('<body>')
print(startposition)
0
Wernazuma 18 Jän. 2019 im 18:59

3 Antworten

Beste Antwort

Content ist vom Typ bytes, daher muss das Argument für Content.find bytes oder int sein, aber '<body>' ist vom Typ {{X6} }. Sie haben also nicht übereinstimmende Typen.

So beheben Sie das Problem: Konvertieren Sie str in bytes:

Content.find(b'<body>')
1
ForceBru 18 Jän. 2019 im 16:02

Ich verstehe nicht, warum das Argument überhaupt "str" ist.

Denn genau das haben Sie übergeben: '<body>' ist ein wörtliches str Objekt. Und bevor Sie fragen, ist Content ein bytes Objekt, das dekodiert werden muss (unter Verwendung der Codierung, die in der Antwort deklariert werden sollte), um eine richtige Zeichenfolge zu erhalten.

Eine viel einfachere Lösung - die vom urllib -Dokument selbst empfohlen wird - besteht nun darin, die Python-Anforderungsbibliothek des dritten Teils zu verwenden, die sich um diese lästigen Details kümmert.

Auch wenn Sie HTML analysieren möchten, verwenden Sie auf jeden Fall einen geeigneten HTML-Parser (BeautifulSoup ist die empfohlene Wahl, wenn Sie mit möglicherweise fehlerhaftem HTML umgehen müssen, was bei weitem der häufigste Fall ist).

1
bruno desthuilliers 18 Jän. 2019 im 16:15

Inhalt hier ist ein Byte-Objekt. Sie versuchen, eine Zeichenfolge durch ein Byte-Objekt zu suchen. Konvertieren Sie Inhalte in eine Zeichenfolge, indem Sie die Zeile ändern

Content = response.read()

Zu

Content = str(response.read())
0
ZWang 18 Jän. 2019 im 16:06