Python + WebDriver, преобразование "\xe7" в нормальный вид

python
webdriver
Теги: #<Tag:0x00007fedb8f764c8> #<Tag:0x00007fedb8f76388>

(Jeyson X) #1

Добрый день.
Решил попробовать себя в автоматизации.
На данный момент пошел только 7 день :smile:
Столкнулся с такой проблемой.
При выполнении запроса с базы

# -- coding: utf-8 --
cur.execute("select city_desc from table1 where rownum = 1 order by dbms_random.value")
result = cur.fetchall()

получаю ответ в виде
('"\xe7\xe0\xef\xe0\xf0\xee\xec\xe0\xf0""\xbf\xe2\xea\xe0"',)

Подскажите как это безобразие можно преобразовать в нормальный вид, имеется ввиду кирилицу, чтобы потом это значение можно было отправить в поле для ввода?

Заранее спасибо.

Python 2.7.5
DB Oracle 11a


(Виталий Коряков) #2
string = '\xe7\xe0\xef\xe0\xf0\xee\xec\xe0\xf0""\xbf\xe2\xea\xe0'
string.encode('hex')

(Jeyson X) #3

получается такое
e7e0efe0f0eeece0f02222bfe2eae0
тоже как то не особо подходит ..

плюс это постоянно надо будет вручную брать значение с лога и подставлять?


(Виталий Коряков) #4

Так а что вы ожидаете получить? Потому как "как то не особо подходит" похоже на подгонку )))


(Stan) #5

А при чем тут вообще encode?

@JeysonX https://docs.python.org/2/library/struct.html примеры внизу, только надо знать как запаковано


(rmerkushin) #6

Проблема в разных кодировках. Вам нужно установить NLS_LANG для клиента Oracle, например так:

from os import environ

environ["NLS_LANG"] = "RUSSIAN_CIS.CL8MSWIN1251"
dsn = cx_Oracle.makedsn(host,  port, service_name)
connection = cx_Oracle.connect(user_name, password, dsn)

P.S.: RUSSIAN_CIS.CL8MSWIN1251 нужно заменить на кодировку которая установлена у вас в БД
Посмотреть кодировку так:

SELECT *
FROM nls_database_parameters

(Jeyson X) #7

Это то что нарыл из настроек
NLS_CHARACTERSET = CL8ISO8859P5
NLS_NCHAR_CHARACTERSET = AL16UTF16

вместо RUSSIAN_CIS.CL8MSWIN1251
подставлял свое AMERICAN_AMERICA.CL8ISO8859P5

и все равно не помогает


(Jeyson X) #8

ну ожидаю в результате получить вывод наподобие "Городище", чтобы потом его можно подставить в поле для ввода


(rmerkushin) #9

Кодировку выставили перед коннектом к бд? Как текст проверяете? Пробовали через print выводить? youstring.decode("utf-8") делали?


(Jeyson X) #10

да, кодировку выставил сразу

# -*- coding: utf-8 -*-
import cx_Oracle
from os import environ
environ["NLS_LANG"] = "AMERICAN_AMERICA.CL8ISO8859P5"

db = cx_Oracle.connect(login,passw, dsn_tns)
...
cur.execute("select city_desc from table1 where rownum = 1 order by dbms_random.value")
result = cur.fetchall()
print result[0]

при попытке сделать "youstring.decode("utf-8")"

result = result.decode("utf-8")

получают ответ
AttributeError: 'list' object has no attribute 'decode'

Я так понимаю, что результат это список, а этот список не имеет такого атрибута.
По идее тогда надо преобразовать в строку, но с этим тоже проблема. Пока не получается, нехватка знаний ((


(Jeyson X) #11

вот еще путем таких манипуляций вроде преобразовал в стринг, но все равно не пашет ...

result = cur.fetchall()    
result = tuple(result)
result = str(result)
result = result.encode('utf-8')
print result

ответ
(('"\xd7\xd0\xdf\xd0\xe0\xde\xdc\xd0\xe0""\xf7\xd2\xda\xd0"',),)


(rmerkushin) #12

ну во-первых fetchall возвращает вам так сказать, список списков. во-вторых, вытащите конкретный элемент и выведите его принтом. Если у вас одна строка возвращается по запросу можно сделать как нибудь так:

rows = cursor.fetchall()
united_rows = []
for row in rows:
    united_rows.extend(row)
d_row = [s.decode("utf-8") if s else "" for s in united_rows]
for x in d_row:
    print x

(Jeyson X) #13

это после того как подставил ваш кусок кода...
UnicodeDecodeError: 'utf8' codec can't decode byte 0xd7 in position 1: invalid continuation byte


(Jeyson X) #14

чуток поковырял

rows = cur.fetchall()
united_rows = []
for row in rows:
    united_rows.extend(row)
d_row = [s.decode("cp1251") if s else "" for s in united_rows]
for x in d_row:
    pass
y = x.encode("utf-8")
print y

получил результат такой
"ЧРЯРаЮЬРа""чТЪР"
понимаю, что уже близко, но никак не получается .. ((


(Stan) #15

выше есть ответ, но почему-то вы его игнорируете и пытаетесь сделать что-то
совершенно непонятное


(rmerkushin) #16

А почему вы думаете что тут поможет struct?


(rmerkushin) #17

Я правильно понимаю что текст - "Запаромар'ївка" - населенный пункт? Если да, то изначальную фразу "\xe7\xe0\xef\xe0\xf0\xee\xec\xe0\xf0""\xbf\xe2\xea\xe0" обрабатывайте через decode("cp1251").


(Stan) #19

Посмотрел на range одного рандомного символа, попал на ї и думал что тут бинарные данные :smile:


(rmerkushin) #20

Не по теме, но я бы руки отрывал людям которые для БД ставят кодировку во всяких cp1251 :smile: Как бы было все проще, если бы везде использовали utf...


(Jeyson X) #21

Совершенно верно.
Вот только я все равно не могу его декодировать ((

изначально обрабатывать это вы имеете ввиду вот так?

result = cur.fetchall()
result = tuple(result)
result = str(result)
result = result.decode("cp1251")
print result