Heim  >  Artikel  >  Backend-Entwicklung  >  Warum wirft „re.findall()“ beim Extrahieren von URLs einen „TypeError: Can\'t Use a String Pattern on a Bytes-Like Object“ aus?

Warum wirft „re.findall()“ beim Extrahieren von URLs einen „TypeError: Can\'t Use a String Pattern on a Bytes-Like Object“ aus?

Susan Sarandon
Susan SarandonOriginal
2024-11-17 11:31:02619Durchsuche

Why Does `re.findall()` Throw a `TypeError: Can't Use a String Pattern on a Bytes-Like Object` When Extracting URLs?

TypeError: Ein Zeichenfolgenmuster kann nicht für ein Byte-ähnliches Objekt in re.findall() verwendet werden

Beim Versuch, automatisch abzurufen Bei URLs von einer Webseite kann der folgende Fehler auftreten:

TypeError: can't use a string pattern on a bytes-like object in re.findall()

In Ihrem Code verwenden Sie re.findall(), um Übereinstimmungen für einen regulären Ausdruck zu finden. Wenn Sie jedoch versuchen, den regulären Ausdruck auf den abgerufenen HTML-Inhalt anzuwenden, erhalten Sie die Fehlermeldung.

Grundlegende Ursache:

Das Problem ist darauf zurückzuführen Tatsache ist, dass der HTML-Inhalt, mit dem Sie arbeiten, im Byte-Format vorliegt, während der von Ihnen verwendete reguläre Ausdruck im String-Format vorliegt. Der reguläre Ausdruck kann nicht direkt auf ein byteartiges Objekt angewendet werden.

Lösung:

Um dieses Problem zu beheben, müssen Sie den HTML-Inhalt in eine Zeichenfolge konvertieren:

html = response.read().decode('utf-8')

Dadurch wird der byteartige HTML-Inhalt in einen String dekodiert, sodass der reguläre Ausdruck erfolgreich angewendet werden kann.

Sobald Sie die Konvertierung durchgeführt haben, können Sie mit der Verwendung fortfahren Der reguläre Ausdruck, um den Titel der Webseite zu finden. Der korrigierte Code sollte so aussehen:

import urllib.request
import re

url = "http://www.google.com"
regex = r'<title>(,+?)</title>'
pattern = re.compile(regex)

with urllib.request.urlopen(url) as response:
   html = response.read().decode('utf-8')

title = re.findall(pattern, html)
print(title)

Das obige ist der detaillierte Inhalt vonWarum wirft „re.findall()“ beim Extrahieren von URLs einen „TypeError: Can\'t Use a String Pattern on a Bytes-Like Object“ aus?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn