python3.8 brotli brotli.error: BrotliDecompress विफल .8

Sep 09 2020

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

जवाब

3 LaurentPinson Nov 03 2020 at 05:11

अनुरोधों के दस्तावेज़ीकरण में इसका उल्लेख कहीं नहीं है लेकिन एक बार ब्रेटली स्थापित हो जाने के बाद, इसे सीधे अनुरोधों द्वारा नियंत्रित किया जाता है।

इसका मतलब है कि प्रतिक्रिया। कॉन्टेंट स्वचालित रूप से डिकोड किया जाएगा (इसी तरह 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 स्थापित है, तो डिकोडिंग घटित होगी और उपयोगकर्ता को कोई चेतावनी नहीं होगी।