расшифровать ответ на запрос get для персидских сайтов - PullRequest
1 голос
/ 27 сентября 2019

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

def gather_links(page_url):
    html_string = ''
    try:
        response = urlopen(page_url)
        if 'text/html' in response.getheader('Content-Type'):
            html_bytes = response.read()
            html_string = html_bytes.decode("utf-8")    
    except Exception as e:
        print(str(e))

показать этоОШИБКА, например https://www.entekhab.ir/:

Кодек utf-8 не может декодировать байт 0x8b в позиции 1: недопустимый начальный байт

как я могуизменить код для декодирования таких сайтов тоже?

Ответы [ 2 ]

1 голос
/ 27 сентября 2019

Вы должны использовать запросы вместо urllib.

import requests

response = requests.get('https://www.entekhab.ir/')
print(response.text)
0 голосов
/ 28 сентября 2019

Проблема в том, что содержимое URL-адреса сжимается с помощью gzip, который, по-видимому, urlopen не обрабатывает по умолчанию:

>>> r = request.urlopen('https://www.entekhab.ir/')
>>> print(r.info())
Server: sepehr-proxy-1.2-rc3
Content-Type: text/html; charset=utf-8
Expires: Mon, 26 Jul 1997 05:00:00 GMT
Cache-Control: post-check=0, pre-check=0
Pragma: no-cache
Connection: close
Content-Length: 81269
Date: Sat, 28 Sep 2019 14:41:49 GMT
Content-Encoding: gzip

Поэтому перед декодированием необходимо распаковать ответ:

>>> import gzip
>>> bs = gzip.decompress(r.read())
>>> bs.decode('utf-8')[:113]
'<!-- 2019/09/28 18:16:08 --><!DOCTYPE html> <html lang="fa-IR" dir="rtl"> <head>           <meta charset="utf-8">'

Как указывает ответ пользователя askaroni, пакет requests обрабатывает этот случай автоматически, и даже документы Python urllib рекомендуют его использовать.Тем не менее, полезно понять , почему ответ не может быть немедленно декодирован.

...