सुंदर सूप - एन्कोडिंग
सभी HTML या XML दस्तावेज़ कुछ विशिष्ट एन्कोडिंग जैसे ASCII या UTF-8 में लिखे गए हैं। हालाँकि, जब आप उस HTML / XML डॉक्यूमेंट को BeautifulSoup में लोड करते हैं, तो इसे यूनिकोड में बदल दिया गया है।
>>> markup = "<p>I will display £</p>"
>>> Bsoup = BeautifulSoup(markup)
>>> Bsoup.p
<p>I will display £</p>
>>> Bsoup.p.string
'I will display £'
उपरोक्त व्यवहार इसलिए है क्योंकि सुंदरसुप्प आंतरिक रूप से यूनिकोड नामक उप-पुस्तकालय का उपयोग करता है, डैमिट को एक दस्तावेज़ के एन्कोडिंग का पता लगाने के लिए और फिर इसे यूनिकोड में परिवर्तित करता है।
हालांकि, हर समय नहीं, यूनिकोड, डेमिट सही अनुमान लगाता है। जैसा कि दस्तावेज़ को एन्कोडिंग का अनुमान लगाने के लिए बाइट-बाय-बाइट की खोज की जाती है, इसमें बहुत समय लगता है। आप कुछ समय बचा सकते हैं और गलतियों से बच सकते हैं, यदि आप पहले से ही इसको सुंदर बनाने के लिए एन्कोडिंग को जानते हैं।
नीचे एक उदाहरण दिया गया है, जहां सुंदरसुपे गलत पहचान करते हैं, ISO-8859-8 के रूप में एक ISO-8859-8 दस्तावेज़ -
>>> markup = b"<h1>\xed\xe5\xec\xf9</h1>"
>>> soup = BeautifulSoup(markup)
>>> soup.h1
<h1>νεμω</h1>
>>> soup.original_encoding
'ISO-8859-7'
>>>
उपरोक्त समस्या को हल करने के लिए, इसे from_encoding का उपयोग करके ब्यूटीफुल पास करें -
>>> soup = BeautifulSoup(markup, from_encoding="iso-8859-8")
>>> soup.h1
<h1>ולש </h1>
>>> soup.original_encoding
'iso-8859-8'
>>>
ब्यूटीफुल 4.4.0 से जोड़ा गया एक और नया फीचर है, बाहर करना। इसका उपयोग किया जा सकता है, जब आपको सही एन्कोडिंग का पता नहीं होता है, लेकिन यह सुनिश्चित करता है कि यूनिकोड, डेमिट गलत परिणाम दिखा रहा है।
>>> soup = BeautifulSoup(markup, exclude_encodings=["ISO-8859-7"])
आउटपुट एन्कोडिंग
एक सुंदरसेप से आउटपुट यूटीएफ -8 दस्तावेज़ है, भले ही सुंदरसुप्र में प्रवेश किए गए दस्तावेज़ के बावजूद। किसी दस्तावेज़ के नीचे, जहाँ ISO-8859-2 प्रारूप में पॉलिश वर्ण हैं।
html_markup = """
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<HTML>
<HEAD>
<META HTTP-EQUIV="content-type" CONTENT="text/html; charset=iso-8859-2">
</HEAD>
<BODY>
ą ć ę ł ń ó ś ź ż Ą Ć Ę Ł Ń Ó Ś Ź Ż
</BODY>
</HTML>
"""
>>> soup = BeautifulSoup(html_markup)
>>> print(soup.prettify())
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta content="text/html; charset=utf-8" http-equiv="content-type"/>
</head>
<body>
ą ć ę ł ń ó ś ź ż Ą Ć Ę Ł Ń Ó Ś Ź Ż
</body>
</html>
उपरोक्त उदाहरण में, यदि आप गौर करते हैं, तो <Sa> टैग को फिर से लिखा गया है कि सुंदरसाउप से उत्पन्न दस्तावेज़ को प्रतिबिंबित करने के लिए अब यूटीएफ -8 प्रारूप में है।
यदि आप UTF-8 में जेनरेट किए गए आउटपुट नहीं चाहते हैं, तो आप इच्छित एन्कोडिंग को प्रीटेट () में असाइन कर सकते हैं।
>>> print(soup.prettify("latin-1"))
b'<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">\n<html>\n <head>\n <meta content="text/html; charset=latin-1" http-equiv="content-type"/>\n </head>\n <body>\n ą ć ę ł ń \xf3 ś ź ż Ą Ć Ę Ł Ń \xd3 Ś Ź Ż\n </body>\n</html>\n'
उपरोक्त उदाहरण में, हमने पूर्ण दस्तावेज़ को एनकोड किया है, हालांकि आप सूप में किसी विशेष तत्व को एनकोड कर सकते हैं जैसे कि वे एक अजगर स्ट्रिंग थे -
>>> soup.p.encode("latin-1")
b'<p>0My first paragraph.</p>'
>>> soup.h1.encode("latin-1")
b'<h1>My First Heading</h1>'
आपके चुने हुए एन्कोडिंग में किसी भी वर्ण का प्रतिनिधित्व नहीं किया जा सकता है, इसे संख्यात्मक XML इकाई संदर्भ में परिवर्तित किया जाएगा। नीचे एक ऐसा उदाहरण है -
>>> markup = u"<b>\N{SNOWMAN}</b>"
>>> snowman_soup = BeautifulSoup(markup)
>>> tag = snowman_soup.b
>>> print(tag.encode("utf-8"))
b'<b>\xe2\x98\x83</b>'
यदि आप "लैटिन -1" या "अस्की" में उपरोक्त एनकोड करने का प्रयास करते हैं, तो यह "☃" उत्पन्न करेगा, यह दर्शाता है कि उसके लिए कोई प्रतिनिधित्व नहीं है।
>>> print (tag.encode("latin-1"))
b'<b>☃</b>'
>>> print (tag.encode("ascii"))
b'<b>☃</b>'
यूनिकोड, डेमिट
यूनिकोड, डेमिटी का उपयोग मुख्य रूप से तब किया जाता है जब आने वाला दस्तावेज़ अज्ञात प्रारूप (मुख्य रूप से विदेशी भाषा) में होता है और हम कुछ ज्ञात प्रारूप (यूनिकोड) में एनकोड करना चाहते हैं और यह भी करने के लिए कि हमें यह सब करने के लिए सुंदरसो की जरूरत नहीं है।