Найти - Пользователи
Полная версия: (вопрос нуба) Lxml : парсинг html : проблемы с кодировками
Начало » Python для новичков » (вопрос нуба) Lxml : парсинг html : проблемы с кодировками
1
Zyamilon
Приветствую!

В питоне я совсем новичек, нужна помощь куда более опытных людей.
Итеется: Python 3.2.2 (default, Sep 4 2011, 09:51:08) on win32
Цель: написание html-парсера
Инструмент: lxml

Собственно учусь парсингу при помощи lxml. Написал код, который открывает локальный html-файлик, убирает из него лишнее оформление при помощи функции clean, далее выдирает ветку нужного html-кода и сохраняет его в html-файл с другим названием.
Проблема в том, что когда программа пытается сохранить ветку html-кода в строку, появляется исключение “TypeError: Type ‘b’list'' cannot be serialized.”. Или я дурак и неправильно всё написал, или действительно что-то не так с кодировками.
Библиотеку Lxml только-только осваиваю, написал первый свой пример и такая ошибка. Пытался исправить сам в течении 2х дней, искал информацию, читал документацию - толку 0. Или исключение, или код не работает и всё тут.

Код оформлен пока просто так, заверну в функции позже. Комментарии - попытки написать по-другому. Не удачные. =/

Код:
#-------------------------------------------------------------------------------
import urllib.request
import lxml.html.clean #help(lxml.html.clean)
##from lxml.html.clean import Cleaner
from lxml import etree
import lxml.html



#-------------------------------------------------------------------------------
#Блок открытия:
filename = 'html-sources/2003.html'
html_code = None
unicode_info = '<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /></head> \n'

#html = open(filename, encoding='utf-8')

html_code = urllib.request.URLopener.open_local_file(html_code, filename).\
read().decode('UTF-8')
##for line in html:
## print(line)



#-------------------------------------------------------------------------------
#Блок обработки:
#clean:
html_code = lxml.html.clean.clean_html(html_code)
print('html_code type is:', type(html_code))

#восстанавливаем основные теги:
html_code = '<html>' + unicode_info + html_code + '</html>'
html_code = html_code.encode('UTF-8')



#lxml:
page = lxml.html.fromstring(html_code.decode('utf8')) #
#page = lxml.html.HTMLParser(encoding="utf-8") #не то, не умеет работать с XPATH
#page = lxml.html.fragments_fromstring(html_code)


from lxml.html import HtmlElement
#txt1 = page.findall('/html/body/div/table/*')
#txt1 = page.xpath('/html/body/div/table/tbody/tr[2]/td/table/tbody/tr/td[2]/*')
#txt1 = page.xpath('/html/body/div/table/*/tr[2]/td/table/*/tr/td[2]/*')

txt1_path = '/html/body/div/table/*'
txt1 = page.xpath(txt1_path)
print('Type of txt1 is ', type(txt1))

#page = lxml.html.tostring(txt1, encoding='utf8', include_meta_content_type=True)
#print(lxml.html.tostring(txt1, encoding='unicode', include_meta_content_type=True))
page = lxml.html.tostring(txt1)
#page = lxml.html.tostring(page.findall('.//'), ) #даже так >___<


#-------------------------------------------------------------------------------
#Блок записи:
fh = None
filename_parsed = 'html-sources/2003_parsed.html'

try:
fh = open(filename_parsed, "w", encoding="utf8") #открыть файл для Wr, utf8
if type(html_code) is not str:
html_code = 'not string'
print('HTML_code is not string!')
## fh.write(unicode_info + '\n')
fh.write(html_code + '\n')
except EnvironmentError as err: #!ошибка окружения
print("ERROR", err)
else:
print("Saved: ", filename_parsed) #если всё ок, пишем инфу
finally: #и ВСЕГДА
if fh is not None: #если в fh что-то есть
fh.close() #закрываем файлик

#2671 string
Помогите пожалуйста! :'( Если можно, с объяснением что да как, почему так происходит…
Оригинальная страница имеет кодировку charset=utf-8.
Да, и чем отличаются друг от друга кодировки utf8, utf-8, UTF8, UTF-8, unicode?
Traceback (most recent call last):
File "***.py", line 53, in <module>
page = lxml.html.tostring(txt1)
File "C:\Program Files\Python32\lib\site-packages\lxml\html\__init__.py", line 1493, in tostring
encoding=encoding)
File "lxml.etree.pyx", line 2868, in lxml.etree.tostring (src/lxml/lxml.etree.c:53743)
TypeError: Type 'b'list'' cannot be serialized.
Zyamilon
Попробовал написать так:
#etree.HTML:
tree = etree.HTML(html_code.decode('utf-8'))
txt1_path = '/html/body/div/table/tbody/tr[2]/td/table/tbody/tr/td[2]/*'
nodes = tree.xpath(txt1_path)

#print(etree.tostring(nodes))
#print(etree.tostring(nodes, method='html', encoding=('utf-8')))
#print(etree.tostringlist(nodes, method='html', encoding=('utf-8')))
#print(etree.tounicode(nodes, method='html'))
и опять, опять та же самая ошибка -__-
Что я делаю не так?
Zyamilon
88 просмотров и ни одного ответа. Печаль.
Вчера проблему решил сам. Дело было в списках.
Zyamilon
Парсер написал, нужные данные выдрал. Теперь имеется несколько словарей с данными и теперь нужно кинуть их в хтмл-табличку.
Подскажите пжл удобный, а главное понятный инструмент для создания html-страниц и, в частности, таблиц на html.

Глядел на E-Factory из lxml.html.builder - документация почти никакая и появились проблемы с включением внутрь цикла for…in и агрементов для тегов :(
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