python3.8 brotli brotli.error: BrotliDecompress विफल .8
mycode python3.8
ब्रतली = 1.0.9
उपयोग अनुरोध प्राप्त करें url, हेडर स्वीकार-एन्कोडिंग = "br" का उपयोग करें मुझे डिकोड ब्र का उपयोग करने की आवश्यकता है, क्योंकि मुझे लगता है कि उपयोग स्वीकार-एन्कोडिंग = br अधिक अच्छा है
import brotli
import requests
headers = {}
headers['Accept'] = "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9"
headers['Accept-Encoding'] = "gzip, deflate, br"
headers['Host'] = "book.douban.com"
headers['Referer'] = "book.douban.com"
headers['Sec-Fetch-Dest'] = "document"
headers['Sec-Fetch-Mode'] = "navigate"
headers['Upgrade-Insecure-Requests'] = "1"
s=requests.Session()
url="https://book.douban.com/tag/%E5%B0%8F%E8%AF%B4"
try:
response = s.get(url, headers=headers)
except:
return ""
if response.status_code == 200:
print(response.headers)
if response.headers.get('Content-Encoding') == 'br':
data = brotli.decompress(response.content)
data1 = data.decode('utf-8')
return data1
else:
return response.text
return ""
त्रुटि उठाना
data = brotli.decompress(response.content)
brotli.error: BrotliDecompress failed
जवाब
अनुरोधों के दस्तावेज़ीकरण में इसका उल्लेख कहीं नहीं है लेकिन एक बार ब्रेटली स्थापित हो जाने के बाद, इसे सीधे अनुरोधों द्वारा नियंत्रित किया जाता है।
इसका मतलब है कि प्रतिक्रिया। कॉन्टेंट स्वचालित रूप से डिकोड किया जाएगा (इसी तरह gzip)। आपको करने की आवश्यकता नहीं हैbrotli.decompress(response.content)
यदि ब्रेटली स्थापित नहीं है, तो आपको कोई त्रुटि संदेश नहीं मिलेगा। इसके बजाय, response.content रहेगा कूटबद्ध ...
संपादित करें :
अनुरोध कोड में खुदाई करने पर, मुझे पता चला कि अनुरोध urllib3.response का उपयोग करते हैं जो ब्रेटली के उपयोग को लागू करता है।
लोड होने पर, urllib3.response ब्रतली के आयात की तलाश करेगा:
try:
import brotli
except ImportError:
brotli = None
तब जब एक प्रतिक्रिया को डिकोड किया जाता है, तो यह उचित डिकोडर का उपयोग करेगा:
def _get_decoder(mode):
if "," in mode:
return MultiDecoder(mode)
if mode == "gzip":
return GzipDecoder()
if brotli is not None and mode == "br":
return BrotliDecoder()
return DeflateDecoder()
इस प्रकार यदि Brotli स्थापित है, तो डिकोडिंग घटित होगी और उपयोगकर्ता को कोई चेतावनी नहीं होगी।