В питоне я совсем новичек, нужна помощь куда более опытных людей.
Итеется: 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.