Problemy z piękną zupą i Unicode
Używam BeautifulSoup do analizowania niektórych stron internetowych.
Od czasu do czasu napotykam błąd „Unicode hell” w następujący sposób:
Patrząc na źródło tego artykułu na stronie TheAtlantic.com [http://www.theatlantic.com/education/archive/2013/10/why-are-harers-of-harvard-students-studying-ancient-chinese-philosophy/280356/ ]
Widzimy to w właściwości og: description meta:
<meta property="og:description" content="The professor who teaches Classical Chinese Ethical and Political Theory claims, "This course will change your life."" />
Kiedy BeautifulSoup analizuje to, widzę to:
>>> print repr(description)
u'The professor who teaches\xa0Classical Chinese Ethical and Political Theory claims, "This course will change your life."'
Jeśli spróbuję zakodować go do UTF-8, tak jak ten komentarz SO sugeruje:https://stackoverflow.com/a/10996267/442650
>>> print repr(description.encode('utf8'))
'The professor who teaches\xc2\xa0Classical Chinese Ethical and Political Theory claims, "This course will change your life."'
Kiedy pomyślałem, że mam wszystkie problemy z Unicode pod kontrolą, nadal nie rozumiem, co się dzieje, więc zamierzam zadać kilka pytań:
1- dlaczego BeautifulSoup konwertuje
do\xa0
[znak spacji w alfabecie łacińskim]? Zestaw znaków i nagłówki na tej stronie to UTF-8. Pomyślałem, że BeautifulSoup pobiera te dane do kodowania? Dlaczego nie został zastąpiony przez<space>
?
2- Czy istnieje wspólny sposób normalizacji białych znaków do konwersji?
3- Kiedy kodowałem do UTF8, gdzie to było\xa0
stać się sekwencją\xc2\xa0
?
Potrafię wszystko przetrzećunicodedata.normalize('NFKD',string)
aby pomóc mi dotrzeć tam, gdzie chcę - ale chciałbym zrozumieć, co jest nie tak i uniknąć w przyszłości tego problemu.