Проблем с кодирането на Python: знак за степен и други

Използвам BeautifulSoup за изчерпване на данни от уеб страница. Искам да сравня данните от уебсайта с текст, който е в .txt документ. Изглежда обаче имам проблеми с кодирането.

Уебсайтът има текст „загрейте фурната до 400°“ Текстът също се появява по този начин в „преглед на източника“ (без html обекти.)

Уебсайтът се чете с помощта на beautifulSoup:

source = "my url".read()
....
soup = BeautifulSoup(source)    

Текстовият документ е създаден чрез създаване на нов текстов документ, кодиран като „Кодиране в UTF-8 без BOM“. След това копирах и поставих „загрейте фурната до 400°“ от уебсайта в текстовия документ и го запазих.

Текстовият файл се чете като

f = codecs.open('myfilename', encoding='utf-8')

Когато сравня двата низа, те не са равни, но искам да са.

За да видя какво се случва: В Eclipse разделям двата текста и, гледайки променливите в режим на отстраняване на грешки, виждам, че знакът за градус от BeautifulSoup се появява като \xc2 \xb0. Знакът за степен от текстовия документ просто се появява като \xb0.

Защо и как да го поправя? Имам този проблем с много специални знаци, така че имам нужда от общо решение. Освен това ще копирам данни от няколко сайта в текстовия документ.


person user984003    schedule 30.01.2012    source източник
comment
stackoverflow.com/search?q=[python]+beautifulsoup+encoding   -  person Ignacio Vazquez-Abrams    schedule 30.01.2012
comment
Знаете кодирането на вашия текстов файл и го използвате по подходящ начин, но кодирането на уебсайта не се взема предвид. По принцип има смисъл само да сравнявате байтове (както правите), ако са в едно и също кодиране или да сравнявате уникод низове (което изисква вземането на байтовете и интерпретирането им с помощта на правилното кодиране).   -  person Cameron    schedule 30.01.2012
comment
Вашият текстов документ изглежда не е в UTF-8, въпреки вашите усилия. Или HTML е някак си двойно кодиран (не е съвсем ясно как сте диагностицирали разликата; прост шестнадесетичен дъмп на файловете би помогнал, ако все пак искате да добавите информация).   -  person tripleee    schedule 30.01.2012
comment
Добре, разбрах го. Прегледах отново как е кодиран уебсайтът, както предложи Камерън. BeautifulSoup автоматично взема предвид кодирането, като правилно превръща всичко в unicode. Проверих това, като направих print soup.originalEncoding. Това е UTF-8, когато създавам супата направо от източника. Въпреки това, преди да създам супата от източника, правя някои замествания на текст с помощта на re.sub(). Това е, което променя utf-8 на източника към нещо, което BeautifulSoup не разпознава. Така че ще разгледам как правя заместванията на текста. Благодаря.   -  person user984003    schedule 30.01.2012


Отговори (1)


Изглежда, че Beautiful Soup няма това, от което се нуждае, за да открие правилно кодирането. Можете да дадете подсказка, като замените BeautifulSoup(източник) с BeautifulSoup(източник, fromEncoding='UTF-8'). Повече опции и информация са онлайн на адрес "Красивата супа ви дава Unicode, по дяволите“.

Байтовете '\xc2\xb0' са това, което получавате, когато UTF-8 кодирането на Unicode кодова точка U+00B0 е погрешно с последното предположение на Beautiful Soup за кодирането, което е Windows 1252.

person minopret    schedule 30.01.2012
comment
Да, благодаря, почти това се оказа проблемът, с обрат. Променях източника, преди да създам супата. След това красивата вече не разпознаваше кодирането. Вижте коментара ми по-горе, започвайки Добре, разбрах го. - person user984003; 30.01.2012