آموزش رمزگذاری در Beautiful Soup
آموزش رمزگذاری در Beautiful Soup
در این درس از مجموعه آموزش برنامه نویسی سایت سورس باران، به آموزش رمزگذاری در Beautiful Soup خواهیم پرداخت.
پیشنهاد ویژه : پکیج آموزش پایتون مختص بازار کار
تمام اسناد HTML یا XML در برخی رمزگذاری های خاص مانند ASCII یا UTF-8 نوشته شده اند. با این حال، هنگامی که آن سند HTML / XML را در BeautifulSoup بارگیری می کنید ، به Unicode تبدیل می شود.
1 2 3 4 5 6 |
>>> markup = "<p>I will display £</p>" >>> Bsoup = BeautifulSoup(markup) >>> Bsoup.p <p>I will display £</p> >>> Bsoup.p.string 'I will display £' |
رفتار بالا به این دلیل است که BeautifulSoup از کتابخانه فرعی به نام Unicode ،Dammit برای شناسایی رمزگذاری یک سند استفاده می کند و سپس آن را به Unicode تبدیل می کند.
از آنجا که سند بایت به بایت برای حدس زدن کدگذاری جستجو می شود، زمان زیادی می برد. اگر از قبل رمزگذاری را از طریق رمزگذاری به سازنده BeautifulSoup می دانید، می توانید کمی صرفه جویی کنید و از اشتباهات جلوگیری کنید.
در زیر یک نمونه از مواردی که BeautifulSoup به اشتباه شناسایی شده است ، یک سند ISO-8859-8 به عنوان ISO-8859-7 –
1 2 3 4 5 6 7 |
>>> markup = b"<h1>\xed\xe5\xec\xf9</h1>" >>> soup = BeautifulSoup(markup) >>> soup.h1 <h1>νεμω</h1> >>> soup.original_encoding 'ISO-8859-7' >>> |
برای حل مشکل بالا، آن را به BeautifulSoup منتقل کنید با استفاده از از-رمزگذاری –
1 2 3 4 5 6 |
>>> soup = BeautifulSoup(markup, from_encoding="iso-8859-8") >>> soup.h1 <h1>ולש </h1> >>> soup.original_encoding 'iso-8859-8' >>> |
یکی دیگر از ویژگی های جدیدی که از BeautifulSoup 4.4.0 اضافه شده است، Excod_encoding است. هنگامی که رمزگذاری صحیح را نمی دانید اما مطمئن هستید که Unicode ، Dammit نتیجه اشتباه نشان می دهد، می توان از آن استفاده کرد.
1 |
>>> soup = BeautifulSoup(markup, exclude_encodings=["ISO-8859-7"]) |
رمزگذاری خروجی
خروجی از BeautifulSoup مستقل از سند وارد شده به BeautifulSoup ، سند UTF-8 است. در زیر یک سند، جایی که کاراکتر های پولیشی در قالب ISO-8859-2 وجود دارد.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
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> |
در مثال بالا، اگر متوجه شدید تگ <meta> بازنویسی شده است تا سند تولید شده از BeautifulSoup را در قالب UTF-8 منعکس کند.
اگر خروجی تولید شده در UTF-8 را نمی خواهید، می توانید رمزگذاری مورد نظر را به صورت ()prettify اختصاص دهید.
1 2 |
>>> 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' |
در مثال بالا ، ما سند کامل را رمزگذاری کرده ایم، با این وجود می توانید هر عنصر خاصی را در سوپ رمزگذاری کنید، مثل اینکه یک رشته پیتون باشد –
1 2 3 4 |
>>> soup.p.encode("latin-1") b'<p>0My first paragraph.</p>' >>> soup.h1.encode("latin-1") b'<h1>My First Heading</h1>' |
هر کاراکتری که نتواند در رمزگذاری انتخابی شما نشان داده شود، به منابع موجودی XML عددی تبدیل می شود. در زیر یکی از این نمونه ها آورده شده است –
1 2 3 4 5 |
>>> 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>' |
اگر سعی کنید موارد بالا را در “latin-1” یا “ascii” رمزگذاری کنید ، این “☃” را ایجاد می کند، نشان می دهد هیچ نمایشی برای آن وجود ندارد.
1 2 3 4 |
>>> print (tag.encode("latin-1")) b'<b>☃</b>' >>> print (tag.encode("ascii")) b'<b>☃</b>' |
Unicode, Dammit
Unicode، Dammit عمدتاً زمانی استفاده می شود که سند ورودی با فرمت ناشناخته (عمدتا به زبان خارجی) باشد و ما می خواهیم در برخی از قالب های شناخته شده (Unicode) رمزگذاری کنیم و همچنین برای انجام همه اینها نیازی به Beautifulsoup نیست.
دیدگاه شما