2016-08-23 5 views
2

У меня возникла проблема при утверждении двух значений non-ascii. Один приходит из файла CSV, а другой, полученный из элемента в HTML:Selenium Python 2.7 - утверждение символов, отличных от ascii

<h1 class="LoginElement">登录</h1> 

Я использую селен, чтобы получить текст

w_msg = driver.find_element(By.CSS_SELECTOR, "h1.LoginElement").text 

Когда я утверждаю, оба значения

assert txt in w_msg 

Я получаю следующее сообщение об ошибке: Сообщ

UnicodeDecodeError: 'ascii' codec can't decode byte 0xe7 in position 0: ordinal not in range(128) 

если напечатать обе переменные и их типы:

print txt 
print type(txt) 
print w_msg 
print type(w_msg) 

возвращает следующее:

登入 
<type 'str'> 
登录 
<type 'unicode'> 

Это, как я инициализирует файл CSV из моего класса "Utility":

def open_csv(base_csv, file_name): 
    csv_file = open(base_csv + file_name, 'rb') 
    reader = csv.reader(csv_file, delimiter=',') 
    row = list(reader) 
    return row 

И вот звонок из теста:

csv = Utility.open_csv(base_csv, file_name) 

ПРИМЕЧАНИЕ: Я использую OpenOffice Calc для создания CSV и сохранить его в кодировке UTF-8

Я пытался много решений, найденных в SO, но до сих пор не могу заставить его работать. Любая помощь или руководство в правильном направлении будет очень оценена.

+0

Какую версию python вы используете? Как выглядят 'txt' и' w_msg', если вы печатаете их перед утверждением? Какие типы являются 'txt' и' w_msg' (например, 'print type (txt)' и 'print type (w_msg)')? – rkersh

+0

Поместите '# - * - кодирование: utf-8 - * -' в первую строку вашего .py-файла. – dm295

+0

@rkesh Python 2.7 Если я печатаю '' x_msg' и txt' они оба печать OK ошибок нет там: 'TXT = 登录 w_msg = 登录 <тип 'юникода'>' и если я пытаюсь '> ул (w_msg) ' Я получаю: ' E UnicodeEncodeError: кодек ascii не может кодировать символы в позиции 0-1: порядковый номер не в диапазоне (128) ' –

ответ

2

Python пытается преобразовать ваш str в Unicode для сравнения. К сожалению, Python 2.x призван ошибаться на стороне осторожности и только расшифровывать вашу строку, используя ASCII.

Вам необходимо декодировать txt в Юникоде, используя соответствующую кодировку CSV-файла, поэтому Python этого не требуется.

Вы можете сделать это с помощью txt.decode(), но это лучший способ сделать это, если Python расшифрует его для вас при чтении файла.

К сожалению, модуль CSV Python 2.x не поддерживает Unicode, так что вы должны использовать падение замены: https://github.com/jdunck/python-unicodecsv

использовать его как:

import unicodecsv 

with open("myfile.csv") as my_csv: 
    r = unicodecsv.reader(my_csv, encoding=YOURENCODING) 

YOURENCODING может быть utf-8, cp1252 или любой кодек, указанный здесь: https://docs.python.org/2/library/codecs.html#standard-encodings

Если CSV получен из Excel, это скорее всего будет кодек, начинающийся с cp

+0

Я использую OpenOffice Calc для создания CSV, я попробую unicodecsv tho и вернусь к вам, если это сработает. –

+0

Работал! Теперь только одно. Мне не нужно было добавлять кодировку, она просто импортировала 'unicodecsv' и заменяла' csv' на мой метод 'open_csv' ' def open_csv (base_csv, имя_файла): csv_file = open (base_csv + file_name, 'rb') reader = unicodecsv.reader (csv_file, delimiter = ',') row = list (reader) return row' –

+0

Кодировка по умолчанию для 'unicodecsv' -' utf-8', что означает, что ваш файл был «utf-8» закодирован. Я бы рекомендовал добавить 'encoding = utf-8', чтобы было ясно, что вы или другие люди, поддерживающие ваш код. –

Смежные вопросы