RegEx Problem (cannot use a string pattern on a bytes-like object)

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
Ne00n
User
Beiträge: 4
Registriert: Montag 18. Juli 2016, 19:43

Hey,

Es ist etwas her das ich mit Python Programmiert habe, hauptsächlich mit PHP/BASH und C#.
Evtl war das auch Python 2 gewesen, das Projekt jetzt benutzt Python 3 da scheint es ein paar Unterschiede zu geben.

li = re.sub('b', '', li)

Simpler RegEx zum entfernen eines b, bekomme ich folgenden Fehler:

TypeError: cannot use a string pattern on a bytes-like object :?:

Anscheind muss dort für Bytes ein b vorgeschrieben werden aber wieso? Ich arbeite mit einen String nicht mit Bytes...
Wieso überhaupt?

Ich hatte zwar bei Google gesucht konnte aber keine brauchbare Erklärung dafür finden.

Danke, Ne00n.
BlackJack

@Ne00n: Wenn Du mit einem String Typ `str` in Python 3 aber `unicode` in Python 2 arbeiten würdest, käme die Fehlermeldung nicht. Wo kommt denn der Wert von `li` her und warum bist Du Dir sicher das ein ein String und kein `bytes`-Objekt (in Python 3, in Python 2 ist das `str`)?
Ne00n
User
Beiträge: 4
Registriert: Montag 18. Juli 2016, 19:43

Die Daten kommen von hierher:

HTML = REQ.urlopen(URL)
HTML = HTML.read()

elements = re.findall(b'http://www.website.de/news/.*html">', HTML)

for li in elements:

Generell sind das für mich Strings, ist halt fragwürdig wieso der Fehler mit Bytes geworfen wird.
BlackJack

@Ne00n: Es ist egal was das für Dich ist. Über eine HTTP-Verbindung kommen Bytes und keine Zeichenketten. Da muss ja auch kein Text drüber gehen, das können auch Sicht des Protokolls auch irgendwelche Binärdaten sein. Bilder oder irgendwelche Dateien zum Download beispielsweise. Du musst entweder die regulären Ausdrücke auch als Bytes angeben oder die Daten mit der entsprechenden Kodierung dekodieren. Allerdings würde ich das einer Bibliothek überlassen, beispielsweise `requests`. Der nächste Fehler ist dann HTML mit regulären Ausdrücken zu verarbeiten statt einen Parser dafür zu verwenden.

Edit: In dem gezeigten regulären Ausdruck verwendest Du ja bereits Bytes, wieso überrascht es dich dann das die damit gefundenen Teile ebenfalls Bytes sind‽ :?:
Ne00n
User
Beiträge: 4
Registriert: Montag 18. Juli 2016, 19:43

Okay, verstanden. Läuft nun auch wunderbar.

Das eine mit den Bytes war rauskopiert aber wollte nun wissen wieso genau das halt so ist.

HTML Parser habe ich mir schon angeschaut, sieht nach weniger Arbeit aus :D

Danke dir.
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@Ne00n: sieht vor allem nach weniger falsch aus. Du hast bei Deinem regulären Ausdruck Glück, dass pro Zeile nur ein Link vorkommt.
Ne00n
User
Beiträge: 4
Registriert: Montag 18. Juli 2016, 19:43

@Sirius3 Das element ist ein Array, da ich weiß das ich mehrere Links bekomme, bzw das ist so gewollt.
BlackJack

@Ne00n: Ich verstehe nicht so wirklich was Du mit dem Satz sagen willst, aber Du hast offensichtlich nicht verstanden das der reguläre Ausdruck falsch ist. Du hast anscheinend nur Glück, das in den Daten keine Konstellation vorkommt, bei dem Du über den Fehler fällst. Reguläre Ausdrücke sind ”greedy”, d.h. '.*' versucht so viele Bytes wie möglich zu matchen und das ist *zu viel* wenn mehr als ein solcher Link in einer Zeile des HTML-Quelltextes vorkommt.
Antworten