Форум сайта python.su
Доброго времени суток уважаемые форумчане.
Пробую тут передать данные на страницу с формами(multipart/form-data) на сайт. Столкнулся с проблемой кодировок. Итак суть:
1. сайт в кодировке Windows-1251
2. файл, в котором идут поля которые нужно передать в кодировке Windows-1251
3. Пример скрипта, тоже в cp1251, запускается на FreeBSD:
#!/usr/bin/env python3 # -*- coding: cp1251 -*- import requests def main(): f = open('/var/ftp/file.txt','r', encoding='cp1251') s_cp1251 = f.read() postdata = { "TopicTitle" : s_cp1251, "TopicDesc" : 'тест', "Post" : 'тест' } headers = { 'User-Agent' : 'Mozilla/5.0 (Windows NT 5.1; rv:20.0) Gecko/20100101 Firefox/20.0', 'Accept' : 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 'Accept-Language' : 'en-US,en;q=0.5', 'Accept-Encoding' : 'gzip, deflate', 'Connection' : 'keep-alive' } s = requests.Session() s.encoding = 'Windows-1251' q = s.post('http://site.com/index.php?', headers=headers, data=postdata, files={'':''}) print(q.status_code) if __name__ == '__main__': main()
Отредактировано omatic (Апрель 11, 2013 22:15:22)
Офлайн
Я уже говорил когда-то... Тех, кто использует восьмибитные кодировки, надо сжигать на кострах.
Офлайн
ZZZ, я тоже за использование юникода и utf-8, но на сайте кодировка Windows-1251, и этого я изменить не могу, вот и пробую выкрутиться, что бы хоть как-то туда автоматический постинг прикрутить.
Офлайн
omaticНа самом деле в s_cp1251 находится Юникод, а requests его заботливо перекодирует в utf-8 при отправке.f = open('/var/ftp/file.txt','r', encoding='cp1251') s_cp1251 = f.read()
import requests text = "Привет мир" data = {"field": text.encode("cp1251")} r = requests.post("http://httpbin.org/post", data=data, files={'':''}) print(r.request.body)
"тест".encode("cp1251")
Офлайн
reclosedev, Спасибо, другой вопрос, передаем мы теперь в бинарном режиме, соответственно в форме на сайте я теперь получаю:
b'\xf2\xe5\xf1\xf2'
"тест".encode("cp1251")
Отредактировано omatic (Апрель 10, 2013 17:25:56)
Офлайн
А вопрос в чем? Как это в текст переделать?
>>> str(b'\xf2\xe5\xf1\xf2', "cp1251") 'тест'
Офлайн
Вопрос в передаче строки через requests в правильной кодировке. Вот пример:
сделал и передал:
text = "Привет мир" data = {"field": text.encode("cp1251")} r = requests.post("http://httpbin.org/post", data=data, files={'':''})
text = "Привет мир" data = {"field": str(text.encode("cp1251"), "cp1251")} r = requests.post("http://httpbin.org/post", data=data, files={'':''})
Отредактировано omatic (Апрель 10, 2013 17:57:28)
Офлайн
omaticГде это смотрится? Полагаю, что получено в ответе с сайта. Так вот перекодируйте это и будет ‘тест’.
в форме получения текст: b'\xf2\xe5\xf1\xf2'
omaticЕстественно
Если я передаю, переделав в текст:…
str(text.encode("cp1251"), "cp1251") == text
Офлайн
reclosedev, на сайте, может я плохо обьяснил, смотрите:
Суть в том , что есть форум, в компании(хостера), мне нужно текст со своего ПК туда постить в ветку форума/новости. Форум у них на IPB старой версии, который на кодировке Windows-1251. Соответственно я делаю логин скриптом и передаю в форму создания поста, слово “тест” POST запросом, вот что я передаю то и появляется в созданной теме на форуме.
тоесть: передаю с Питона слово тест а получаю на форуме тест , соответственно я немогу там его кодировать/декодировать , передавая бинарным способом и т.п.
Вот тут то я и запутался, я неправильно передаю или просто форма форума не правильно воспринимает то что я передаю?
Отредактировано omatic (Апрель 10, 2013 18:42:27)
Офлайн
"TopicTitle" : s_cp1251.encode('cp1251'),
"TopicDesc" : 'тест'.encode('cp1251'),
"Post" : 'тест'.encode('cp1251')
http://gamejam.ru/files/codepages.png
Отредактировано ZZZ (Апрель 10, 2013 19:45:30)
Офлайн