解码波斯网站获取请求的响应
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 文档也推荐使用它。尽管如此,了解为什么无法立即解码响应还是很有用的。
我正在编写用于发送请求和获取网站响应并解析其内容的函数... 但是当我向波斯网站发送请求时,它无法解码它的内容
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 文档也推荐使用它。尽管如此,了解为什么无法立即解码响应还是很有用的。