Обработка символов Юникода http-агентов пользователя в python - PullRequest
1 голос
/ 07 января 2011

Я совершенно новичок в python, но нашел пакет, который мне нужно использовать, и тестирую его.Рассматриваемый пакет python: pywurfl .

. Я создал простой код на основе примера, приведенного путем чтения строк User-agent (UA) из столбца в простом текстовом файле.Существует очень большое количество UA (некоторые могут иметь иностранные символы).Теперь файл, содержащий UA, был создан с помощью команды вывода bash ">" и сценария perl.Например, perl somescript.pl> outfile.txt.

Однако при запуске следующего кода в этом файле я получаю сообщение об ошибке.

#!/usr/bin/python

import fileinput
import sys

from wurfl import devices
from pywurfl.algorithms import LevenshteinDistance


for line in fileinput.input():
    line = line.rstrip("\r\n")    # equiv of chomp
    H = line.split('\t')

    if H[27]=='Mobile':

        user_agent = H[23].decode('utf8')           
        search_algorithm = LevenshteinDistance()
        device = devices.select_ua(user_agent, search=search_algorithm)

        sys.stdout.write( "%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s" % (user_agent, device.devid, device.devua, device.fall_back, device.actual_device_root, device.brand_name, device.marketing_name, device.model_name, device.device_os, device.device_os_version, device.mobile_browser, device.mobile_browser_version, device.model_extra_info, device.pointing_method, device.has_qwerty_keyboard, device.is_tablet, device.has_cellular_radio, device.max_data_rate, device.wifi, device.dual_orientation, device.physical_screen_height, device.physical_screen_width,device.resolution_height, device.resolution_width, device.full_flash_support, device.built_in_camera, device.built_in_recorder, device.receiver, device.sender, device.can_assign_phone_number, device.is_wireless_device, device.sms_enabled) + "\n")

    else:
        # do something else
        pass

Здесь H [23] - столбецкоторый имеет строку UA.но я получаю ошибку, которая выглядит как

UnicodeDecodeError: 'utf8' codec can't decode byte 0xa9 in position 0: unexpected code byte

Когда я заменил 'utf8' на 'latin1', я получил следующую ошибку

 sys.stdout.write(................) # with the .... as in the code
UnicodeEncodeError: 'ascii' codec can't encode character u'\xa9' in position 0: ordinal not in range(128).

Я что-то здесь не так делаю?Мне нужно преобразовать строку UA в Unicode, потому что пакет такой.Я не слишком хорошо разбираюсь в Unicode, особенно в Python.Как бы я справился с этой ошибкой?Например, найдите строку UA, которая дает эту ошибку, чтобы я мог задать более информированный вопрос?

1 Ответ

2 голосов
/ 07 января 2011

Похоже, у вас есть две отдельные проблемы.

Первая - вы предполагаете, что входным файлом является utf-8, а это не так.Изменение входной кодировки на латинские адреса 1, которые выдают.

Вторая проблема заключается в том, что ваш stdout, похоже, настроен на вывод ascii, поэтому запись не удалась.Для этого этот вопрос может помочь.

...