سؤال

أحتاج إلى تخزين محتوى الموقع الذي يمكن أن يكون بأي لغة. وأنا بحاجة إلى أن أكون قادرًا على البحث في المحتوى عن سلسلة 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">.

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