بيثون urllib, مينيدوم و تحليل الشخصيات الدولية
-
05-07-2019 - |
سؤال
عند محاولة استرداد معلومات من جوجل API الطقس مع العنوان التالي ،
http://www.google.com/ig/api?weather=Munich ألمانيا&hl=دي
ثم محاولة تحليل مع مينيدوم لي خطأ أن الوثيقة لم تتشكل بشكل جيد.
استخدام التعليمات البرمجية التالية
sock = urllib.urlopen(url) # above mentioned url
doc = minidom.parse(sock)
أعتقد الألمانية الشخصيات في الرد هو سبب الخطأ.
ما هي الطريقة الصحيحة للقيام بذلك ؟
المحلول
ترميز أرسلت في رؤوس iso-8859-1 وفقا بايثون urllib.urlopen (على الرغم من أن فايرفوكس يعيش رؤوس http يبدو أن نختلف مع لي في هذه الحالة - تقارير utf-8).في xml نفسها لا يوجد ترميز محدد --> هذا هو السبب في xml.دوم.مينيدوم يفترض انها utf-8.
لذا التالية يجب إصلاح هذه المشكلة محددة:
import urllib
from xml.dom import minidom
sock = urllib.urlopen('http://www.google.com/ig/api?weather=Munich,Germany&hl=de')
s = sock.read()
encoding = sock.headers['Content-type'].split('charset=')[1] # iso-8859-1
doc = minidom.parseString(s.decode(encoding).encode('utf-8'))
تحرير:لقد تم تحديث هذا الجواب بعد تعليق جلين ماينارد.أخذت الحرية في اتخاذ خط واحد من الجواب من اللاعب lennert Regebro.
نصائح أخرى
يبدو أن هذا العمل:
sock = urllib.urlopen(url)
# There is a nicer way for this, but I don't remember right now:
encoding = sock.headers['Content-type'].split('charset=')[1]
data = sock.read()
dom = minidom.parseString(data.decode(encoding).encode('ascii', 'xmlcharrefreplace'))
أعتقد مينيدوم لا تحمل أي شيء غير ascii.قد ترغب في النظر في lxml بدلا من ذلك, فإنه لا.