Requests: Response.text рдЕрдиреБрдЪрд┐рдд рддрд░реАрдХреЗ рд╕реЗ рдбрд┐рдХреЛрдб рдХрд┐рдпрд╛ рдЧрдпрд╛ рдкрд╛рда рд▓реМрдЯрд╛рддрд╛ рд╣реИ (рдЕрдиреБрд░реЛрдз 1.2.3, рдЕрдЬрдЧрд░ 2.7)

рдХреЛ рдирд┐рд░реНрдорд┐рдд 15 рд╕рд┐рддре░ 2013  ┬╖  24рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: psf/requests

рдЕрдЧрд░ рдПрдЪрдЯреАрдЯреАрдкреА рд╕рд░реНрд╡рд░ рдХрдВрдЯреЗрдВрдЯ-рдЯрд╛рдЗрдк: рдЯреЗрдХреНрд╕реНрдЯ/* рдмрд┐рдирд╛ рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рдХреЗ рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рддреЛ 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 (/cc @ sigmavirus24), рдЗрд╕рд╕реЗ рднреА рдЖрд╕рд╛рди, рдЖрдк рдмрд╕ рд╕реНрд╡рдпрдВ рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

>>> r = requests.get('http://irresponsible-server/')
>>> r.encoding = 'utf-8'

рдлрд┐рд░, рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдЖрдЧреЗ рдмрдврд╝реЗрдВред

рд╕рднреА 24 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рдЗрд╕рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж @lavr!

рдпрд╣ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдЬрд╛рдирдмреВрдЭрдХрд░ рдбрд┐рдЬрд╛рдЗрди рдирд┐рд░реНрдгрдп рд╣реИред рд╣рдо рдХрд▓реНрдкрдирд╛ рдХрд╛ рдкрд╛рд▓рди рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдЬрдм рддрдХ рдХрд┐ рд╣рдо рдЦреБрдж рдХреЛ рдРрд╕реА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдирд╣реАрдВ рдкрд╛рддреЗ рд╣реИрдВ рдЬрд╣рд╛рдВ рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рджреБрдирд┐рдпрд╛ рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рд╕реЗ рдЗрддрдиреА рдмреЗрддрд╣рд╛рд╢рд╛ рдЕрд▓рдЧ рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдПрдХ рд╕рдорд╕реНрдпрд╛ рдмрди рдЬрд╛рддреА рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдкреЛрд╕реНрдЯ рдХреЗ 302 рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рдмрд╛рдж рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ)ред

рдпрджрд┐ рдЕрдкрд╕реНрдЯреНрд░реАрдо рд╕рд░реНрд╡рд░ рдЬрд╛рдирддрд╛ рд╣реИ рдХрд┐ рд╕рд╣реА рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рдХреНрдпрд╛ рд╣реИ, рддреЛ рдЙрд╕реЗ рдЗрд╕рдХрд╛ рд╕рдВрдХреЗрдд рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЕрдиреНрдпрдерд╛, рд╣рдо рдЙрд╕ рдпреБрдХреНрддрд┐ рдХрд╛ рдкрд╛рд▓рди рдХрд░рдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ рдЬреЛ рдпреБрдХреНрддрд┐ рдХрд╣рддреА рд╣реИред =)

рдпрджрд┐ рдЖрдкрдХреЛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдЦрд░рд╛рдм рд╣реИ, рддреЛ рдореИрдВ рдЖрдкрдХреЛ рдЗрд╕ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП HTTP/2.0 рдХреЗ рд▓рд┐рдП RFC рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдЕрддреНрдпрдзрд┐рдХ рдкреНрд░реЛрддреНрд╕рд╛рд╣рд┐рдд рдХрд░рддрд╛ рд╣реВрдВред =)

рдХреНрдпрд╛ @Lukasa рдХрд╣рд╛ + рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдЕрдЧрд░ рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рд╣реЗрдбрд░ рд╕реЗ рд▓рд┐рдпрд╛ рдЧрдпрд╛ рди рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИ рд╣рдо рдкрд░ рднрд░реЛрд╕рд╛ рдХрд░рддреЗ рд╣реИрдВ рдирд╛рдЯрдХ рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рдореЗрдВ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдирд╛ред рдЗрддрдиреЗ рдХрдо рд╡рд░реНрдгреЛрдВ рдХреЗ рд╕рд╛рде, рд╕рд╛рд░рдб рдХреБрдЫ рднреА рдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд▓реМрдЯрд╛рдПрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд╛рдВрдЦреНрдпрд┐рдХреАрдп рдбреЗрдЯрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ

рд╕рдЪ рдХрд╣реВрдВ рддреЛ рд╕рд╛рд▓ рд╕реЗ рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ рдФрд░ рди рд╣реА рд╕реНрдкреЗрд╕рд┐рдлрд┐рдХреЗрд╢рди рдореЗрдВ рдХреЛрдИ рдмрджрд▓рд╛рд╡ рдЖрддрд╛ рд╣реИред

рдпрджрд┐ рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдЖрдк рдХрд┐рд╕ рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рддреЛ рдЖрдк рд╕реНрд╡рдпрдВ рдХреЛ рдбрд┐рдХреЛрдбрд┐рдВрдЧ рднреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

text = str(r.content, '<ENCODING>', errors='replace')

рдЬрд╣рд╛рдВ рддрдХ тАЛтАЛрдореЗрд░рд╛ рд╕рдВрдмрдВрдз рд╣реИ, рдЕрдиреБрд░реЛрдзреЛрдВ рдореЗрдВ рдХреБрдЫ рднреА рдЧрд▓рдд рдирд╣реАрдВ рд╣реИ рдФрд░ рдпрд╣ рдХрд┐рд╕реА рднреА рддрд░рд╣ рдХреА рдЧрдбрд╝рдмрдбрд╝реА рдирд╣реАрдВ рд╣реИред рдЪреВрдВрдХрд┐ @ рд▓реБрдХрд╛рд╕рд╛ рдореБрдЭрд╕реЗ рд╕рд╣рдордд рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЗрд╕реЗ рдмрдВрдж рдХрд░ рд░рд╣рд╛ рд╣реВрдВред

@lavr (/cc @ sigmavirus24), рдЗрд╕рд╕реЗ рднреА рдЖрд╕рд╛рди, рдЖрдк рдмрд╕ рд╕реНрд╡рдпрдВ рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

>>> r = requests.get('http://irresponsible-server/')
>>> r.encoding = 'utf-8'

рдлрд┐рд░, рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдЖрдЧреЗ рдмрдврд╝реЗрдВред

@kennethreitz рдпрд╣ рдирд┐рд░рд╛рд╢рд╛рдЬрдирдХ рд╣реИред рд╣рдо рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЗрддрдирд╛ рдЖрд╕рд╛рди рдХреНрдпреЛрдВ рдмрдирд╛ рд░рд╣реЗ рд╣реИрдВ? = рдкреА

рдмрд┐рд▓реНрдХреБрд▓ :)

рдЬреНрдпрд╛рджрд╛рддрд░ рдЬрд╛рдкрд╛рдиреА рд╡реЗрдмрд╕рд╛рдЗрдЯреЛрдВ рдХреЗ рд▓рд┐рдПред рд╡реЗ рд╕рднреА рдЕрдкрдиреЗ рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЭреВрда рдмреЛрд▓рддреЗ рд╣реИрдВред

@sigmavirus24
рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ, рдХрд┐ utils.get_encoding_from_headers рд╣рдореЗрд╢рд╛ 'ISO-8859-1' рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рдФрд░ charade рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рдореМрдХрд╛ рдирд╣реАрдВ рд╣реИред
рддреЛ рдмрдЧ рд╣реИ: рд╣рдо рдЙрдореНрдореАрдж рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рдХрд╛ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЪрд░рджреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИред

рдКрдкрд░ рдПрдХ рдкреИрдЪ рдмрдЧ рдХреЛ рдареАрдХ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА RFC рдХрд╛ рдЕрдиреБрд╕рд░рдг рдХрд░рддрд╛ рд╣реИред
рдХреГрдкрдпрд╛, рдЗрд╕рдХреА рд╕рдореАрдХреНрд╖рд╛ рдХрд░рдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред

@lavr рдХреНрд╖рдорд╛ рдХрд░реЗрдВ, рд╣рдордиреЗ рдЗрд╕реЗ рдмрд╣реБрдд рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИред рд╣рдо _not_ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рд╕рд╛рд░рдереА рдХреЛ рдмреБрд▓рд╛рдП рдЬрд╛рдиреЗ рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░рддреЗ рд╣реИрдВред 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 рдХрднреА рднреА рдХреЛрдИ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

r.encoding == 'ISO-8859-1' ... рдЗрд╕рдХрд╛ рдХреНрдпрд╛ рдорддрд▓рдм рд╣реИ ? рд╕рд░реНрд╡рд░ рдиреЗ рдЪрд╛рд░рд╕реЗрдЯ рднреЗрдЬрд╛ = 'ISO-8859-1' рдпрд╛ рд╕рд░реНрд╡рд░ рдиреЗ рдХреЛрдИ рдЪрд╛рд░рд╕реЗрдЯ рдирд╣реАрдВ рднреЗрдЬрд╛? рдЕрдЧрд░ рдкрд╣рд▓реЗ, рдореБрдЭреЗ рд╡рд░реНрдгрдорд╛рд▓рд╛ рдХрд╛ рдЕрдиреБрдорд╛рди рдирд╣реАрдВ рд▓рдЧрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

@lavr рдореИрдВ рдЧреИрд░-рдкрд╛рда рдЖрдзрд╛рд░реЛрдВ рдХреЛ рдХрд╡рд░ рдХрд░ рд░рд╣рд╛ рдерд╛ред рдЖрдк рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдЗрд╕ рд╢рд░реНрдд рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ charset рд╕рдВрднрд╛рд╡рдирд╛ рд╕реЗ рдЗрдВрдХрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

r.encoding == 'ISO-8859-1' and not 'ISO-8859-1' in r.headers.get('Content-Type', '')

@рд▓реБрдХрд╛рд╕рд╛
рдЦреИрд░, рдореИрдВ рдЗрд╕ рд╣реИрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВред
рдФрд░ рдкреВрд░реНрд╡реА рдпреВрд░реЛрдк рдФрд░ рдПрд╢рд┐рдпрд╛ рдореЗрдВ рд╣рд░ рдХреЛрдИ рдЗрд╕рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░ рд╕рдХрддрд╛ рд╣реИред

рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдЕрдЧрд░ рд╣рдо рдЗрд╕реЗ рдЕрдиреБрд░реЛрдзреЛрдВ рдореЗрдВ рдареАрдХ рдХрд░ рджреЗрдВ? ;)
рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рдЕрдиреБрд░реЛрдз рдИрдорд╛рдирджрд╛рд░реА рд╕реЗ enconding=None рдмрд┐рдирд╛ рдЪрд╛рд░рд╕реЗрдЯ рдХреЗ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдкрд░ рд╕реЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ?

рдЬреИрд╕рд╛ рдХрд┐ рд╣рдордиреЗ рдХрдИ рдмрд╛рд░ рдЪрд░реНрдЪрд╛ рдХреА рд╣реИ, рдЕрдиреБрд░реЛрдз рдкрддреНрд░ рдХреЗ 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'

рдлрд┐рд░, рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдЖрдЧреЗ рдмрдврд╝реЗрдВред

рдЗрд╕рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж! рдЗрд╕реЗ рдПрдХ рдкрдВрдХреНрддрд┐ рдореЗрдВ рдХреИрд╕реЗ рдХрд░реЗрдВ рдЗрд╕ рдкрд░ рдХреЛрдИ рд╡рд┐рдЪрд╛рд░?

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

tiran picture tiran  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

Matt3o12 picture Matt3o12  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

remram44 picture remram44  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

Gonzalliz picture Gonzalliz  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

thadeusb picture thadeusb  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ