दिलचस्प पोस्ट
क्लास .getResource () और ClassLoader.getResource () का निष्पादन योग्य जार में अजीब व्यवहार क्या आप एक एचटीएमएल रेडियो बटन को चेकबॉक्स की तरह दिख सकते हैं? SCRIPT7002: XMLHttpRequest: नेटवर्क त्रुटि 0x2ef3, त्रुटि 00002ef3 के कारण ऑपरेशन पूरा नहीं कर सका जावास्क्रिप्ट: कक्षा। विधि बनाम कक्षा। प्रोटोपीपी। विधि IBeacon ब्लूटूथ प्रोफाइल क्या है एंड्रॉइड के लिए चेकबॉक्स के लिए चेक और अनचेक किए गए आइकन बदलें कोड द्वारा ग्रिडदृश्य छुपाएं कॉलम Get-Aduser -Filter एक चर को स्वीकार नहीं करेगा चालक निष्पादन योग्य webdriver.ie.driver सिस्टम संपत्ति द्वारा निर्धारित किया जाना चाहिए डीबगिंग। Htaccess के लिए युक्तियां फिर से लिखना नियम मेरी एईएस एन्क्रिप्शन एक अमान्यकीई अपवाद को क्यों फेंकता है? विंडोज पर भरोसेमंद file.renameTo () विकल्प? किसी स्लाइड को ऊपर / नीचे एनीमेशन के साथ एक दृश्य दिखाएं और छिपाएं खारिज करें ModalViewController और पास डेटा वापस चरित्र प्रदर्शन पाठ एनीमेशन द्वारा एंड्रॉइड कैरेक्टर

पायथन और सुंदरसूप एन्कोडिंग समस्याएं

मैं एक क्रॉलर को खूबसूरत सूट का इस्तेमाल करते हुए पायथन के साथ लिख रहा हूं, और जब तक मैं इस साइट पर नहीं जाता तब तक सबकुछ तैरती ही जा रहा था:

http://www.elnorte.ec/

मुझे अनुरोध पुस्तकालय के साथ सामग्री मिल रही है:

r = requests.get('http://www.elnorte.ec/') content = r.content 

अगर मैं उस समय सामग्री वैरिएंट का प्रिंट करता हूं, तो सभी स्पैनिश विशेष वर्ण ठीक काम कर रहे हैं। हालांकि, एक बार मैं सामग्री वैरिएबल को खूबसूरत सूप में खिलााने की कोशिश करता हूं यह सब गड़बड़ हो जाता है:

 soup = BeautifulSoup(content) print(soup) ... <a class="blogCalendarToday" href="/component/blog_calendar/?year=2011&amp;month=08&amp;day=27&amp;modid=203" title="1009 artÃculos en este dÃa"> ... 

यह जाहिरा तौर पर सभी स्पैनिश स्पेशल कैरेक्टर (एक्सेंट एंड व्हाटॉट) को ऊपर उठाना है। मैंने content.decode ('utf-8'), content.decode ('latin-1') करने की कोशिश की है, जिसमें एन्कोडिंग पैरामीटर से सुंदरसूप के साथ घूमने की भी कोशिश की गई थी, इसे एन्कोडिंग = 'यूटीएफ -8' और एन्कोडिंग से सेट करना = 'लैटिन -1', लेकिन अभी भी कोई पासा नहीं है।

किसी भी संकेत की सराहना की जाएगी

वेब के समाधान से एकत्रित समाधान "पायथन और सुंदरसूप एन्कोडिंग समस्याएं"

क्या आप कोशिश कर सकते हैं:

 r = urllib.urlopen('http://www.elnorte.ec/') x = BeautifulSoup.BeautifulSoup(r.read) r.close() print x.prettify('latin-1') 

मुझे सही उत्पादन मिलता है ओह, इस विशेष मामले में आप x.__str__(encoding='latin1') भी कर सकते हैं।

मुझे लगता है क्योंकि सामग्री ISO-8859-1 (5) में है और मेटा http-equiv सामग्री-प्रकार गलत तरीके से "UTF-8" कहती है

क्या आप इस बात की पुष्टि कर सकते है?

आपके मामले में इस पृष्ठ में यूट -8 डेटा गलत है, जो सुंदरसूप को भ्रमित करता है और ऐसा लगता है कि आपका पेज विंडोज़ 1252 का उपयोग करता है, आप यह चाल कर सकते हैं:

 soup = BeautifulSoup.BeautifulSoup(content.decode('utf-8','ignore')) 

ऐसा करने से आप पृष्ठ के स्रोत से किसी भी गलत प्रतीकों को त्याग देंगी और खूबसूरत सूप अतिथि के एन्कोडिंग को ठीक करेंगे।

आप 'प्रतिस्थापित' द्वारा 'अनदेखा' की जगह ले सकते हैं और '?' के लिए पाठ की जांच कर सकते हैं। प्रतीकों को देखने के लिए कि क्या छोड़ा गया है।

असल में यह क्रॉलर लिखने के लिए बहुत मुश्किल काम है जो हर बार पेज एन्कोडिंग को 100% मौके के साथ अनुमान लगा सकता है (ब्राउजर्स इस पर आजकल बहुत अच्छा है), आप 'कार्डेट' जैसे मॉड्यूल का उपयोग कर सकते हैं, लेकिन उदाहरण के लिए, आपके मामले में यह एन्कोडिंग अनुमान लगाएगा आईएसओ -8859-2 के रूप में, जो भी सही नहीं है

अगर आपको वास्तव में किसी भी पृष्ठ उपयोगकर्ता के लिए एन्कोडिंग संभवतः आपूर्ति करनी है – आपको या तो एक बहु-स्तर का निर्माण करना चाहिए (यूटीएफ -8 का प्रयास करें, लैटिन 1 का प्रयास करें, आदि का प्रयास करें …) पहचान समारोह (जैसे हमने हमारे प्रोजेक्ट में किया था ) या सी मॉड्यूल के रूप में फ़ायरफ़ॉक्स या क्रोमियम से कुछ पहचान कोड का उपयोग करें।

पहला जवाब सही है, यह फ़ंक्शन कुछ बार प्रभावी हैं

  def __if_number_get_string(number): converted_str = number if isinstance(number, int) or \ isinstance(number, float): converted_str = str(number) return converted_str def get_unicode(strOrUnicode, encoding='utf-8'): strOrUnicode = __if_number_get_string(strOrUnicode) if isinstance(strOrUnicode, unicode): return strOrUnicode return unicode(strOrUnicode, encoding, errors='ignore') def get_string(strOrUnicode, encoding='utf-8'): strOrUnicode = __if_number_get_string(strOrUnicode) if isinstance(strOrUnicode, unicode): return strOrUnicode.encode(encoding) return strOrUnicode 

मैं एक अधिक विधिवत मूर्ख सबूत दृष्टिकोण लेने का सुझाव था

 # 1. get the raw data raw = urllib.urlopen('http://www.elnorte.ec/').read() # 2. detect the encoding and convert to unicode content = toUnicode(raw) # see my caricature for toUnicode below # 3. pass unicode to beautiful soup. soup = BeautifulSoup(content) def toUnicode(s): if type(s) is unicode: return s elif type(s) is str: d = chardet.detect(s) (cs, conf) = (d['encoding'], d['confidence']) if conf > 0.80: try: return s.decode( cs, errors = 'replace' ) except Exception as ex: pass # force and return only ascii subset return unicode(''.join( [ i if ord(i) < 128 else ' ' for i in s ])) 

आप इस पर कोई फर्क नहीं पड़ सकते कि आप इस पर फेंक सकते हैं, यह हमेशा मान्य यूनिकोड को बीएस भेज देगा।

नतीजतन, आपका पर्सड् पेड़ बहुत बेहतर व्यवहार करेगा और जब भी आपके पास नया डेटा होगा तो नए और रोचक तरीके से विफल नहीं होंगे।

परीक्षण और त्रुटि संहिता में काम नहीं करती – केवल बहुत सारे संयोजन हैं 🙂

आप यह कोशिश कर सकते हैं, जो प्रत्येक एन्कोडिंग के लिए काम करता है

  from bs4 import BeautifulSoup from bs4.dammit import EncodingDetector headers = {"User-Agent": USERAGENT} resp = requests.get(url, headers=headers) http_encoding = resp.encoding if 'charset' in resp.headers.get('content-type', '').lower() else None html_encoding = EncodingDetector.find_declared_encoding(resp.content, is_html=True) encoding = html_encoding or http_encoding soup = BeautifulSoup(resp.content, 'lxml', from_encoding=encoding)