解码波斯网站获取请求的响应

decode response of get request for persian websites

我正在编写用于发送请求和获取网站响应并解析其内容的函数... 但是当我向波斯网站发送请求时,它无法解码它的内容

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' codec can't decode byte 0x8b in position 1: invalid start byte

如何更改解码此类网站的代码?

你应该使用 requests 而不是 urllib。

import requests

response = requests.get('https://www.entekhab.ir/')
print(response.text)

问题是 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 文档也推荐使用它。尽管如此,了解为什么无法立即解码响应还是很有用的。