http μλ²κ° μΈμ½λ© μμ΄ Content-type: text/*λ₯Ό λ°ννλ©΄ Response.textλ νμ 'ISO-8859-1' ν μ€νΈλ‘ λμ½λ©ν©λλ€.
RFC2616/3.7.1μμλ μ ν¨ν μ μμ§λ§ 2013λ μλ μ€μνμμ μλͺ»λμμ΅λλ€.
μ€κ΅μ΄ ν
μ€νΈλ‘ μμ νμ΄μ§λ₯Ό λ§λ€μμ΅λλ€.
http://lavr.github.io/python-emails/tests/requests/some-utf8-text.html
λͺ¨λ λΈλΌμ°μ λ μ΄ νμ΄μ§λ₯Ό μ¬λ°λ₯΄κ² λ λλ§ν©λλ€.
κ·Έλ¬λ reguests.getμ μλͺ»λ ν
μ€νΈλ₯Ό λ°νν©λλ€.
λ€μμ ν΄λΉ URLμ μ¬μ©ν κ°λ¨ν ν
μ€νΈμ
λλ€.
https://gist.github.com/lavr/6572927
@lavrλ κ°μ¬ν©λλ€!
μ΄κ²μ μμ²μ λν μλμ μΈ λμμΈ κ²°μ μ λλ€. μ¬μμ΄ μ€μ λμκ³Ό λ무 λ§μ΄ λ¬λΌ λ¬Έμ κ° λλ μμΉμ μμ§ μλ ν μ¬μμ λ°λ₯΄κ³ μμ΅λλ€(μ: POSTμ λν 302 μλ΅ ν GET).
μ μ€νΈλ¦Ό μλ²κ° μ¬λ°λ₯Έ μΈμ½λ©μ΄ 무μμΈμ§ μκ³ μμΌλ©΄ μ νΈλ₯Ό 보λ΄μΌ ν©λλ€. κ·Έλ μ§ μμΌλ©΄ μ¬μμ΄ λ§νλ κ²μ λ°λ₯Ό κ²μ λλ€. =)
μ¬μ κΈ°λ³Έκ°μ΄ μλͺ»λ κ²μ΄λΌκ³ μκ°νλ€λ©΄ μ΄ κΈ°λ³Έκ°μ λ³κ²½νκΈ° μν΄ HTTP/2.0μ© RFC νλ‘μΈμ€μ μ°Έμ¬νλ κ²μ΄ μ’μ΅λλ€. =)
@Lukasaλ + ν€λμμ κ²μ μΈμ½λ©μ΄ μ‘΄μ¬νμ§ μλ κ²½μ° μ°λ¦¬κ°μ μμ‘΄νλ€λ μ¬μ€ λ§νλ€ λ¬΄μ νꡬ μΈμ½λ© μΆμΈ‘ ν μ μμ΅λλ€. λ¬Έμ μκ° λ무 μ κΈ° λλ¬Έμ charadeλ ν΅κ³ λ°μ΄ν°λ₯Ό μ¬μ©νμ¬ μ¬λ°λ₯Έ μΈμ½λ©μ΄ 무μμΈμ§ μΆμΈ‘ νκΈ° λλ¬Έμ νμ€ν κ²°κ³Όλ₯Ό λ°ννμ§ μμ΅λλ€.
μμ§ν μ°λλ μ°¨μ΄κ° μμΌλ©° μ¬μλ λ³κ²½λμ§ μμ΅λλ€.
μ΄λ€ μΈμ½λ©μ μμνλμ§ μκ³ μλ€λ©΄ λ€μκ³Ό κ°μ΄ μ§μ λμ½λ©ν μλ μμ΅λλ€.
text = str(r.content, '<ENCODING>', errors='replace')
λ΄κ° μΌλ €νλ ν μμ²μλ μλ¬΄λ° λ¬Έμ κ° μμΌλ©° μ΄κ²μ μ¬κΈ°μ λ²κ·Έλ μλλλ€. @Lukasa κ° μ μκ² λμνλ κ² κ°μμ μ΄ κΈμ λ«μ΅λλ€.
@lavr (/cc @sigmavirus24), κ·Έλ³΄λ€ ν¨μ¬ λ μ½κ² μΈμ½λ©μ μ§μ μ 곡ν μ μμ΅λλ€.
>>> r = requests.get('http://irresponsible-server/')
>>> r.encoding = 'utf-8'
κ·Έλ° λ€μ μ μμ μΌλ‘ μ§ννμμμ€.
@kennethreitz μ€λ§μ€λ½μ΅λλ€. μ μ°λ¦¬λ μ¬λλ€μ μν΄ κ·Έκ²μ μ½κ² λ§λ€κ³ μμ΅λκΉ? =νΌ
μ μ μΌλ‘ :)
μ£Όλ‘ μΌλ³Έ μΉμ¬μ΄νΈμ©μ λλ€. κ·Έλ€μ λͺ¨λ μμ μ μΈμ½λ©μ λν΄ κ±°μ§λ§μ ν©λλ€.
@sigmavirus24
utils.get_encoding_from_headersλ νμ 'ISO-8859-1'μ λ°ννκ³ charadeλ νΈμΆλ κΈ°νκ° μλ€λ μ μ μ μνμμμ€.
κ·Έλμ λ²κ·Έλ: μ°λ¦¬λ charadeκ° μΈμ½λ©μ μΆμΈ‘νλ λ° μ¬μ©λλ€κ³ μμνμ§λ§ κ·Έλ μ§ μμ΅λλ€.
μμ ν¨μΉλ λ²κ·Έλ₯Ό μμ νμ§λ§ μ¬μ ν RFCλ₯Ό λ°λ¦
λλ€.
κ²ν ν΄ λ³΄μκΈ° λ°λλλ€.
@lavr μ£μ‘ν©λλ€. μ΄ μ μ λͺ
νν νμ§ λͺ»νμ΅λλ€. μ°λ¦¬λ μ΄ κ²½μ°μ charadeκ° νΈμΆλκΈ°λ₯Ό κΈ°λνμ§ _μμ΅λλ€_. RFCλ λ§€μ° λͺ
νν©λλ€. λ¬Έμ μ§ν©μ μ§μ νμ§ μκ³ MIME μ νμ΄ text/*
μΈ κ²½μ° μΈμ½λ©μ ISO-8859-1λ‘ κ°μ ν΄μΌ ν©λλ€. κ·Έκ²μ "μΆμΈ‘νμ§ λ§μμμ€"λ₯Ό μλ―Έν©λλ€. =)
@lavr : r.encoding
λ₯Ό None
λ‘ μ€μ νλ©΄ μμλλ‘ μλν©λλ€.
λλ r.encoding = r.apparent_encoding
.
λ μ’μ΅λλ€.
r.encoding = None
λ° r.encoding = r.apparent_encoding
μλ² λ¬Έμ μ§ν© μ λ³΄κ° μμ€λμμ΅λλ€.
μλ² ν€λλ₯Ό μμ ν 무μνλ κ²μ μ’μ ν΄κ²°μ±
μ΄ μλλΌκ³ μκ°ν©λλ€.
μ¬λ°λ₯Έ μ루μ μ λ€μκ³Ό κ°μ΅λλ€.
r = requests.get(...)
params = cgi.parse_header(r.headers.get('content-type'))[0]
server_encoding = ('charset' in params) and params['charset'].strip("'\"") or None
r.encoding = server_encoding or r.apparent_encoding
text = r.text
μ΄μν΄ λ³΄μ¬μ :(
λλ λ€μμ μννμμμ€.
r = requests.get(...)
if r.encoding is None or r.encoding == 'ISO-8859-1':
r.encoding = r.apparent_encoding
λλ κ·Έλ κ² μκ°νμ§ μμ΅λλ€ :)
r.encoding is None
μ μλ―Έκ° μμ΅λλ€. r.encodingμ content-type=text/*μ λν΄ Noneμ΄ λ μ μκΈ° λλ¬Έμ
λλ€.
r.encoding == 'ISO-8859-1'
...μ(λ) λ¬΄μ¨ λ»μΈκ°μ? μλ²μμ charset='ISO-8859-1'μ 보λκ±°λ μλ²μμ charsetμ 보λ΄μ§ μμμ΅λκΉ? λ¨Όμ charsetμ μΆμΈ‘ν΄μλ μλ©λλ€.
@lavr λΉν
μ€νΈ κΈ°λ°μ λ€λ£¨κ³ μμμ΅λλ€. λμ λ€μ 쑰건μ μ¬μ©νμ¬ charset
κ°λ₯μ±μ λ°°μ ν μ μμ΅λλ€.
r.encoding == 'ISO-8859-1' and not 'ISO-8859-1' in r.headers.get('Content-Type', '')
@루카μ¬
κΈμ, λλμ΄ ν΄νΉμ μ¬μ©ν μ μμ΅λλ€.
κ·Έλ¦¬κ³ λμ λ½κ³Ό μμμμ λͺ¨λ μ¬λλ€μ΄ μ¬μ©ν μ μμ΅λλ€.
κ·Έλ¬λ μμ²μμ μμ νλ©΄ μ΄λ»κ² λ κΉμ? ;)
μμ²μ΄ charset μμ΄ μλ΅μ λν΄ μ μ§νκ² enconding=None
λ₯Ό μ€μ ν μ μλ€λ©΄ μ΄λ»κ² λ κΉμ?
μ¬λ¬ λ² λ Όμν κ²μ²λΌ Requestsλ HTTP μ¬μμ λ°λ₯΄κ³ μμ΅λλ€. νμ¬μ νλμ μλͺ»λ κ²μ΄ μλλλ€. =)
μ¬μ© μ¬λ‘μ λμμ΄ λμ§ μλλ€λ μ¬μ€μ μμ ν λ€λ₯Έ μ΄μΌκΈ°μ λλ€. =)
μ’μμ, μ΄κ²μΌλ‘ μΆ©λΆν λ Όμκ° μμ΅λλ€. νΌλλ°±μ μ£Όμ μ κ°μ¬ν©λλ€.
μ λ°μ΄νΈλ HTTP 1.1μ ISO-8859-1 κΈ°λ³Έ λ¬Έμ μ§ν©μ μ¬μ©νμ§ μμ΅λλ€. http://tools.ietf.org/html/rfc7231#appendix -B
μ°λ¦¬λ μ΄λ―Έ #2086μμ μ΄κ²μ μΆμ νκ³ μμ΅λλ€. =)
κ±±μ ν μ μλ μ¬λ, μ¬κΈ°μ νΈνμ± ν¨μΉκ° μμ΅λλ€.
λ€μ μ½λλ‘ requests_patch.py
νμΌμ μμ±νκ³ κ°μ Έμ€λ©΄ λ¬Έμ κ° ν΄κ²°λ©λλ€.
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import requests
import chardet
def monkey_patch():
prop = requests.models.Response.content
def content(self):
_content = prop.fget(self)
if self.encoding == 'ISO-8859-1':
encodings = requests.utils.get_encodings_from_content(_content)
if encodings:
self.encoding = encodings[0]
else:
self.encoding = chardet.detect(_content)['encoding']
if self.encoding:
_content = _content.decode(self.encoding, 'replace').encode('utf8', 'replace')
self._content = _content
self.encoding = 'utf8'
return _content
requests.models.Response.content = property(content)
monkey_patch()
@lavr (/cc @sigmavirus24), κ·Έλ³΄λ€ ν¨μ¬ λ μ½κ² μΈμ½λ©μ μ§μ μ 곡ν μ μμ΅λλ€.
>>> r = requests.get('http://irresponsible-server/') >>> r.encoding = 'utf-8'
κ·Έλ° λ€μ μ μμ μΌλ‘ μ§ννμμμ€.
κ°μ¬ν©λλ€! ν μ€λ‘ μννλ λ°©λ²μ λν μμ΄λμ΄κ° μμ΅λκΉ?
κ°μ₯ μ μ©ν λκΈ
@lavr (/cc @sigmavirus24), κ·Έλ³΄λ€ ν¨μ¬ λ μ½κ² μΈμ½λ©μ μ§μ μ 곡ν μ μμ΅λλ€.
κ·Έλ° λ€μ μ μμ μΌλ‘ μ§ννμμμ€.