Python.expat لا يمكن تحليل ملف XML مع رموز سيئة. كيف تتجول؟
-
21-09-2019 - |
سؤال
أحاول تحليل ملف 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؟