Python.expat لا يمكن تحليل ملف XML مع رموز سيئة. كيف تتجول؟

StackOverflow https://stackoverflow.com/questions/2495538

سؤال

أحاول تحليل ملف XML (بيانات OSM) باستخدام المغتربين ، وهناك خطوط تحتوي على بعض أحرف Unicode التي لا يمكن للوافدة تحليلها:

<tag k="name"
v="абвгдежзиклмнопр�?туфхцчшщьыъ�?ю�?�?БВГДЕЖЗИКЛМ�?ОПРСТУФХЦЧШЩЬЫЪЭЮЯ" />

<tag k="name" v="Cin\x8e? Rex" />

(ترميز ملف XML في سطر الفتح هو "UTF-8")

الملف قديم جدًا ، ويجب أن يكون هناك أخطاء. في الملفات الحديثة ، لا أرى أخطاء UTF-8 ، ويتم تحليلها بشكل جيد. ولكن ماذا لو كان برنامجي يفي برمز مكسور ، ما الحل الذي يمكنني صنعه؟ هل من الممكن الانضمام إلى برامج ترميز BZ2 (أنا تحليل ملف مضغوط) وترميز UTF-8 لتجاهل الأحرف المكسورة ، أو تغييرها إلى "؟"؟

هل كانت مفيدة؟

المحلول

لست متأكدًا مما إذا كانت الأحرف "" "تم تقديمها عن طريق سلسلة نسخ هنا ، ولكن إذا كان لديك في البيانات الأصلية ، فيبدو أن مشكلة المولد هي التي قدمت ufffd charactes على النحو التالي:

"تستخدم لاستبدال شخصية واردة قيمتها غير معروفة أو غير قابلة للتمثيل في Unicode"

citied من:http://www.fileformat.info/info/unicode/char/fffd/index.htm

حل بديل؟ مجرد فكرة عن التمديد:

good = True
buf = None
while True:
if good:
        buf = f.read(buf_size)
        else:
        # try again with cleaned buffer
        pass
        try:
            xp.Parse(buf, len(buf) == 0)
            if (len(buf) == 0):
                    break
        good = True
    except ExpatError:
        if xp.ErrorCode  == XML_ERROR_BAD_CHAR_REF:
            # look at ErrorByteIndex (or nearby)
            # for 0xEF 0xBF 0xBD (UTF8 replacement char) and remove it
            good = False
        else:
            # other errors processing
            pass

أو تنظيف العازلة الإدخال بدلاً من ذلك + حالات الزاوية (تسلسل جزئي في نهاية المخزن المؤقت). لا أستطيع أن أتذكر ما إذا كان المغترب من Python يسمح بتعيين معالج خطأ مخصص. سيكون ذلك أسهل بعد ذلك.

إذا قمت بتنظيف عينة من الأحرف "" "، فسيتم معالجتها بشكل جيد. xd1 لا يفشل.

بيانات OSM؟

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top