Уведомления

Группа в Telegram: @pythonsu

#1 Дек. 15, 2012 14:38:32

xupacuma
Зарегистрирован: 2012-12-14
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

Проблема кодировки BeautifulSoup + dict

Здравствуйте!
Возникла непонятная проблема кодировки при записи в словарь

Есть 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 и подсчет совпадений выделенных фрагментов в многих файлах. Возможно, словари - не лучшее решение для хранения этих данных, буду рада советам как это можно улучшить.

Офлайн

#2 Дек. 15, 2012 15:32:34

4kpt
От: Харьков
Зарегистрирован: 2010-11-03
Сообщения: 998
Репутация: +  63  -
Профиль   Отправить e-mail  

Проблема кодировки BeautifulSoup + dict

Смотрите…

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')



Отредактировано 4kpt (Дек. 15, 2012 16:06:19)

Офлайн

#3 Дек. 15, 2012 17:30:15

xupacuma
Зарегистрирован: 2012-12-14
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

Проблема кодировки BeautifulSoup + dict

СПАСИБО! И правда, оказалось, что проблема в отображении вывода словаря.

если вывод заменить на цикл, который добирается до самой строки - то все работает!

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() в ваших примерах

Отредактировано xupacuma (Дек. 15, 2012 17:46:53)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version