Konvertieren Sie io.BytesIO in io.StringIO, um die HTML-Seite zu analysieren

Lesezeit: 2 Minuten

Ich versuche, eine HTML-Seite zu parsen, die ich über pyCurl abgerufen habe, aber die pyCurl WRITEFUNCTION gibt die Seite als BYTES und nicht als Zeichenfolge zurück, sodass ich sie nicht mit BeautifulSoup parsen kann.

Gibt es eine Möglichkeit, io.BytesIO in io.StringIO zu konvertieren?

Oder gibt es eine andere Möglichkeit, die HTML-Seite zu analysieren?

Ich verwende Python 3.3.2.

  • tut der naive Ansatz der Erschöpfung der BytesIO und dann baue a StringIO von der Ausgabe nicht Ihren Zwängen genügen?

    – Anthony Sottile

    4. Juli 2014 um 4:32 Uhr

Der Code in der akzeptierten Antwort liest tatsächlich vollständig aus dem Stream zum Decodieren. Unten ist der richtige Weg, einen Stream in einen anderen zu konvertieren, wo die Daten Chunk für Chunk gelesen werden können.

# Initialize a read buffer
input = io.BytesIO(
    b'Inital value for read buffer with unicode characters ' +
    'ÁÇÊ'.encode('utf-8')
)
wrapper = io.TextIOWrapper(input, encoding='utf-8')

# Read from the buffer
print(wrapper.read())

  • Könnten Sie bitte ein Beispiel für das Lesen Stück für Stück hinzufügen?

    – Nairum

    30. Juni 2020 um 11:28 Uhr

  • @AlexeiMarinichenko Sie können sich in den Dokumenten über die Methoden von TextIOWrapper informieren. Versuchen wrapper.read(5), wrapper.realine().

    – Kakaruken

    1. Juli 2020 um 14:17 Uhr

Ein naiver Ansatz:

# assume bytes_io is a `BytesIO` object
byte_str = bytes_io.read()

# Convert to a "unicode" object
text_obj = byte_str.decode('UTF-8')  # Or use the encoding you expect

# Use text_obj how you see fit!
# io.StringIO(text_obj) will get you to a StringIO object if that's what you need

  • Danke, es hat funktioniert. Aber anstelle von bytes_io.read() habe ich bytes_io.getvalue() verwendet, da ersteres nicht funktionierte.

    – Shipra

    8. Juli 2014 um 3:59 Uhr

  • ah ja, ich habe deine angenommen BytesIO war am Anfang des Streams. getvalue Ich glaube, sollte funktionieren, egal wo du bist 🙂

    – Anthony Sottile

    8. Juli 2014 um 4:25 Uhr

  • Normalerweise müsstest du anrufen bytes_io.seek(0) vor dem Aufruf von read(). Wie @AnthonySottile erwähnt, getvalue umgeht das.

    – Quantum7

    12. Dezember 2017 um 13:26 Uhr

  • scheint sehr ineffizient zu sein – wir müssen die gesamte Datei in den Speicher laden, um dafür zu dekodieren. Dies sollte für kleine Dateien gut funktionieren, aber nicht für die großen.

    – Serge

    2. Dezember 2020 um 8:35 Uhr


  • Beide aktuellen Antworten haben diese Ineffizienz – ich könnte dies wahrscheinlich mit einer inkrementellen Decoder-Antwort aktualisieren, aber an dieser Stelle lohnt es sich nicht wirklich

    – Anthony Sottile

    2. Dezember 2020 um 16:30 Uhr

1176290cookie-checkKonvertieren Sie io.BytesIO in io.StringIO, um die HTML-Seite zu analysieren

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy