Найти - Пользователи
Полная версия: Проблема кодировки BeautifulSoup + dict
Начало » Python для новичков » Проблема кодировки BeautifulSoup + dict
1
xupacuma
Здравствуйте!
Возникла непонятная проблема кодировки при записи в словарь

Есть html файл примерно такого вида:
<h3> Текст 1 </h3>
<p> ...<b>в первом абзаце</b> ....</p>
<p> ... </p>
<p> ...<b>фрагмент 1</b> <b>фрагмент 2</b>....</p>
<h3> Текст n </h3>
...
<h3> Конец </h3>
Задача - собрать все выделенные фрагменты с сохранением информации в каком тексте и в каком абзаце они находятся.
html разбираю с помощью BeautifulSoup
информацию и фрагменты храню в словаре вида text = [, , ], где len(text) - количество абзацев в i-том тексте

Возникает проблема кодировки. При записи строки извлекаемой из <b> - все нормально,
При печати всего словаря - посимвольные кракозябы (\xd1\x83\xd0\). Но могу понять где и почему.
Помогите, пожалуйста, разобраться.

# -*- coding: utf-8 -*-
filename = 'C:/work/fulltest.htm'
html_doc = open(filename, 'r')
from BeautifulSoup import BeautifulSoup
soup = BeautifulSoup(html_doc)

#подсчет заголовков == количество текстов + 1
count_h = soup.body.findAll('h3')

h = soup.body.find('h3') #первый заголовок в файле == первый текст
texts = {} #словарь вида [nt] -> [[s, s],[s],[s, s, s]]
i = 0

while i < len(count_h) - 1 :
pars = [] # содержание абзацев текста
while h.nextSibling.nextSibling.name != 'h3':
bolds = h.findAll('b') # все выделенные фрагменты абзаца
s_bolds = [] #тут храним строки из b.string
for j in range(len(bolds)) :
#print bolds[j].string
s_bolds.append(str(bolds[j].string).decode('utf8')) #переводим в строчку и храним не ссылку
print s_bolds[j] # выдает 'в первом абзаце'

h = h.nextSibling.nextSibling #переходим на следующий элемент
pars.append(s_bolds)

texts[i] = pars
i += 1 # следующий текст (h3)
h = h.nextSibling.nextSibling #переходим на следующий элемент

print texts # {выдает '0: [[], [u`\u0443\u043f ... '

ps: В питоне разбираюсь второй день, очень неопытный программист. Дальнейшее использование этого словаря - запись в sqlite и подсчет совпадений выделенных фрагментов в многих файлах. Возможно, словари - не лучшее решение для хранения этих данных, буду рада советам как это можно улучшить.
4kpt
Смотрите…
a = [u"Коля", u"Витя"]
print a
Просто неккоректно отображается.
[u'\u041a\u043e\u043b\u044f', u'\u0412\u0438\u0442\u044f']
Если сделать
for name in a:
    print name
Выведет все отлично.
Коля
Витя
Решить проблему:
a = [u"Коля", u"Витя"]
print repr(a).decode("unicode_escape")
Выдаст
[u'Коля', u'Витя']

P.S. Еще очень смущает эта строка: str(bolds.string).decode('utf8')
xupacuma
СПАСИБО! И правда, оказалось, что проблема в отображении вывода словаря.

если вывод заменить на цикл, который добирается до самой строки - то все работает!
for key in texts:
print key
for p in texts[key]:
for b in p:
print b
>>>0
>>>управления

С этой строкой долго мучилась.
s_bolds.append(str(bolds[j].string).decode('utf8')) 

str() применяется чтоб хранить просто строчку - иначе, как я поняла, хранилась ссылка на содержание тега b, и документ с всего 10-15 тегами выводился в консоль больше минуты. С конвертированием в строку все стало работать значительно быстрее. Кроме того к b.string не применяется .decode()

ps: не могу понять, что именно делает repr() в ваших примерах
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB