[PYTHON] [AWS] Umgang mit dem Fehler "Ungültiger Codepunkt" in CloudSearch

Dieser Artikel fasst zusammen, wie mit dem Fehler "Ungültiger Codepoin xx" in [AWS] CloudSearch umgegangen wird. Ich habe den Code in Python geschrieben, aber ich denke, die Punkte sind für alle Sprachen gleich.

[Hinzugefügt am 22.09.2020] Die hier eingeführte Funktion zum Löschen von Zeichen, bei denen CloudSearch einen Fehler zurückgibt, hat möglicherweise Zeichen gelöscht, die nicht gelöscht werden müssen. Wir werden diesen Artikel zu einem späteren Zeitpunkt überprüfen und aktualisieren.

Was ist ein Fehler "Ungültiger Codepunkt xx"?

Tritt auf, wenn Sie einen Text oder einen Textarray-Typ im Indexfeld einer CloudSearch-Suchdomäne festlegen und versuchen, Zeichen hochzuladen, die das Feld nicht akzeptieren kann. Wenn beispielsweise ein Texttypfeld mit dem Namen title ein Ersatzzeichen (SUB) enthält, wird die folgende Fehlermeldung zurückgegeben.

Validation error for field 'title': Invalid codepoint 1A

1A ist eine Art Steuerzeichen, das als Ersatzzeichen bezeichnet wird und ein ungültiger Codepunkt für Texttypfelder ist. Ich bin auf diesen Fehler gestoßen, weil die Daten, mit denen ich zu tun hatte, Codepunktzeichen wie "1A" und "08" enthielten.

Einfache Antwortmethode

Hier ist eine Funktion, die unzulässige Zeichen entfernt.

def remove_invalid_code2(text: str) -> str:
    RE_ILLEGAL = u"[^\u0009\u000a\u000d\u0020-\uD7FF\uE000-\uFFFD]"
    return re.sub(RE_ILLEGAL, "", text)

Verwenden Sie für Zeichenfolgen in Feldern, die als Text oder Textarray eingegeben wurden, diese Funktion, um unzulässige Zeichen zu entfernen.

Der Punkt ist, dass ** ich die Funktion auf jede Zeichenfolge anwenden werde **. Denken Sie nicht: "Wenn Sie mit" json.dumps "serialisieren, können Sie den illegalen Zeichencode auf einmal entfernen." Sie werden ein bitteres Gefühl haben.

Unten finden Sie einen Beispielcode zum Hochladen von Benutzerklassendaten in die Suchdomäne. Ich liebe Typen, also codiere ich, während ich Typen mit mypy überprüfe.

import json
import re
from dataclasses import asdict, dataclass
from typing import Any, ClassVar, Dict, List, Literal, TypedDict
from uuid import uuid4

import boto3
from mypy_boto3_cloudsearchdomain import CloudSearchDomainClient

def remove_invalid_code(text: str) -> str:
    RE_ILLEGAL = u"[^\u0009\u000a\u000d\u0020-\uD7FF\uE000-\uFFFD]"
    return re.sub(RE_ILLEGAL, "", text)


class AddBatchItem(TypedDict):
    type: Literal["add"]
    id: str
    fields: Dict[str, Any]


class DeleteBatchItem(TypedDict):
    type: Literal["delete"]
    id: str


BatchItem = Union[AddBatchItem, DeleteBatchItem]
Type = Literal["add", "delete"]


@dataclass
class User:
    id: str
    name: str
    age: int
    short_description: str
    description: str

    _text_fields: ClassVar[List[str]] = ["short_description", "description"]

    def get_batch_item(self, operation_type: Type) -> BatchItem:
        if operation_type == "delete":
            return {"id": self.id, "type": "delete"}

        fields = asdict(self)
        del fields["id"]

        #Punkt: Wenden Sie die Funktion auf jeden Wert an! !!
        fields = {
            k: remove_invalid_code(v) if k in self._text_fields else v
            for k, v in fields.items()
        }

        return {"id": self.id, "type": "add", "fields": fields}


if __name__ == "__main__":

    SEARCH_ENDPOINT = "http://xxxx.com"
    client: CloudSearchDomainClient = boto3.client(
        "cloudsearchdomain", endpoint_url=SEARCH_ENDPOINT
    )

    user = User(
        id=str(uuid4()),
        name="John",
        age=18,
        short_description="es geht mir gut",
        description="Es geht mir gut! !!" + u"\b" + "Freut mich, dich kennenzulernen!",
    )

    batch_items = [user.get_batch_item("add")]
    docs = json.dumps(batch_items).encode("utf-8")
    client.upload_documents(documents=docs, contentType="application/json")

Das ist alles für diesen Artikel.

Es fiel mir schwer, zu der einfachen Lösung zu gelangen, die ich hier vorgestellt habe. Ich habe vor, einen weiteren Artikel darüber zu schreiben, was ich daraus gelernt habe.

Jetzt kann ich "... eine Art Steuerzeichen ... einen Codepunkt (na ja, wissen Sie?)" Schreiben. Als ich jedoch auf einen Fehler stieß, war ich mit dem Zeichencode nicht vertraut, sodass ich beim Debuggen große Probleme hatte. tat. Wenn Sie von einem vagen Verständnis dieses Bereichs begeistert sind, lesen Sie bitte den nächsten Artikel. Ich freue mich darauf.

Recommended Posts

[AWS] Umgang mit dem Fehler "Ungültiger Codepunkt" in CloudSearch
Wie man mit Python-Installationsfehlern in pyenv umgeht (BUILD FAILED)
Umgang mit Speicherlecks in matplotlib.pyplot
Umgang mit Laufzeitfehlern in subprocess.call
[AWS] Umgang mit WordPress "Beim Zuschneiden eines Bildes ist ein Fehler aufgetreten."
Umgang mit Pyenv-Initialisierungsfehlern bei Fischen 3.1.0
Vorgehensweise beim Ausführen von Transaktionen: In Anaconda fehlgeschlagen
So behandeln Sie den Fehler "Kein Modul mit dem Namen '' '" in Jupyter Notebook | Install with! Pip!
Umgang mit unausgeglichenen Daten
Umgang mit dem DistributionNotFound-Fehler
Für Anfänger, wie man mit häufigen Fehlern in Keras umgeht
So unterdrücken Sie Anzeigefehler in matplotlib
So arbeiten Sie mit BigQuery in Python
Umgang mit Enum-Kompatibilitätsfehlern
Umgang mit OAuth2-Fehlern bei Verwendung von Google APIs aus Python
Umgang mit SSL-Fehlern beim Herstellen einer Verbindung zu S3 mit Python boto
Wie man mit verstümmelten Charakteren in json von Django REST Framework umgeht
Was tun, wenn die Python-Version in Cloud 9 von einer anderen Person erstellt wurde?
Umgang mit Fehlern beim Auftreffen auf pip pip
[REAPER] Wie man Reascript mit Python spielt
Ich kann nicht nerven. Wie man mit nervigen Objekten umgeht
Der Umgang mit dem Modul'tensorflow 'hat kein Attribut' '
Melden Sie sich einfach mit mehreren Konten bei AWS an
Wie man tkinter mit Python in Pyenv benutzt
[AWS] Umgang mit Wordpress "Die Antwort ist nicht die richtige JSON-Antwort."
So konvertieren / wiederherstellen Sie einen String mit [] in Python
Erklären Sie ausführlich, wie Sie mit Python einen Sound erzeugen
Problemumgehung für Djangos Vorlage existiert nicht
So führen Sie mit OpenCV ein Null-Padding in einer Zeile durch
So führen Sie Tests zusammen mit Python unittest aus
So laden Sie Dateien in Google Drive mit Google Colaboratory
Zugriff mit dem Cache beim Lesen von_json mit Pandas
So installieren Sie Poesie (Fehlerbehandlung) in einer zsh-Umgebung
Umgang mit dem Fehler "Typfehler: Keine übereinstimmende Signatur gefunden" bei Verwendung von pandas fillna
So extrahieren Sie einen Termin in Google Kalender mit Python
So überprüfen Sie das Verhalten von ORM mit einer Datei mit django
So manipulieren Sie das DOM im Iframe mit Selen
Wie man mit Theano besetzt
Eine Geschichte über den Umgang mit dem CORS-Problem
Wie mit SQLAlchemy ändern?
So gehen Sie mit dem Fehler um, dass der MySQL-Container von Docker in der Docker Toolbox nicht gestartet werden kann
So trennen Sie Zeichenfolgen mit ','
Wie man RDP auf Fedora31 macht
Wie man in Python entwickelt
So erstellen Sie einen Datenrahmen und spielen mit Elementen mit Pandas
Umgang mit UnicodeDecodeError beim Ausführen des Downloads von Google-Bildern
2 Möglichkeiten, mit SessionNotCreatedException umzugehen
Wie lösche ich mit SQLAlchemy?
So melden Sie sich mit Python bei AtCoder an und senden automatisch
[VLC] Wie man mit dem Problem umgeht, dass es während der Wiedergabe nicht im Vordergrund steht
Umgang mit dem Fehler "Fehler beim Laden des Moduls" canberra-gtk-module ", der beim Ausführen von OpenCV auftritt
Wie man Japanern nicht entgeht, wenn man mit json in Python umgeht
Umgang mit "Sie haben mehrere Authentifizierungs-Backends konfiguriert ..." (Django)
So verwenden Sie Python in Pyenv unter MacOS mit PyCall
So installieren Sie Pandas auf EC2 (Umgang mit MemoryError und PermissionError)