urllib2 قراءة إلى Unicode
سؤال
أحتاج إلى تخزين محتوى الموقع الذي يمكن أن يكون بأي لغة. وأنا بحاجة إلى أن أكون قادرًا على البحث في المحتوى عن سلسلة Unicode.
لقد جربت شيئًا مثل:
import urllib2
req = urllib2.urlopen('http://lenta.ru')
content = req.read()
المحتوى عبارة عن دفق بايت ، لذلك يمكنني البحث عنه عن سلسلة Unicode.
أحتاج إلى حد ما عندما أفعل urlopen
ثم اقرأ لاستخدام Charset من الرؤوس لفك تشفير المحتوى وترميزه في UTF-8.
المحلول
بعد العمليات التي قمت بها ، سترى:
>>> req.headers['content-type']
'text/html; charset=windows-1251'
وهكذا:
>>> encoding=req.headers['content-type'].split('charset=')[-1]
>>> ucontent = unicode(content, encoding)
ucontent
هي الآن سلسلة Unicode (من 140655 حرفًا)-على سبيل المثال لعرض جزء منها ، إذا كانت محطة UTF-8:
>>> print ucontent[76:110].encode('utf-8')
<title>Lenta.ru: Главное: </title>
ويمكنك البحث ، إلخ ، إلخ.
تحرير: عادةً ما يكون Unicode I/O أمرًا صعبًا (قد يكون هذا هو ما يحتفظ بالموظف الأصلي) ، لكنني سأتجاوز المشكلة الصعبة المتمثلة ، بمجرد إدخال سلسلة Unicode بشكل صحيح (أقوم بذلك عن طريق النقاط الكود-أبله ولكن ليس صعبًا ؛-) ، فإن البحث هو على الإطلاق غير عقلاني (وبالتالي نأمل أن يكون السؤال الأصلي قد تمت الإجابة عليه تمامًا). مرة أخرى على افتراض محطة UTF-8:
>>> x=u'\u0413\u043b\u0430\u0432\u043d\u043e\u0435'
>>> print x.encode('utf-8')
Главное
>>> x in ucontent
True
>>> ucontent.find(x)
93
ملحوظة: ضع في اعتبارك أن هذه الطريقة قد لا تعمل مع جميع المواقع ، لأن بعض المواقع تحدد فقط ترميز الأحرف داخل المستندات التي يتم تقديمها (باستخدام علامات META HTTP-EQUIV ، على سبيل المثال).
نصائح أخرى
لتحليل Content-Type
رأس HTTP ، يمكنك استخدامه cgi.parse_header
وظيفة:
import cgi
import urllib2
r = urllib2.urlopen('http://lenta.ru')
_, params = cgi.parse_header(r.headers.get('Content-Type', ''))
encoding = params.get('charset', 'utf-8')
unicode_text = r.read().decode(encoding)
طريقة أخرى للحصول على Charset:
>>> import urllib2
>>> r = urllib2.urlopen('http://lenta.ru')
>>> r.headers.getparam('charset')
'utf-8'
أو في بيثون 3:
>>> import urllib.request
>>> r = urllib.request.urlopen('http://lenta.ru')
>>> r.headers.get_content_charset()
'utf-8'
يمكن أيضًا تحديد ترميز الأحرف داخل مستند HTML على سبيل المثال ، <meta charset="utf-8">
.