Найти - Пользователи
Полная версия: Парсинг html с помощью lxml парсера
Начало » Python для новичков » Парсинг html с помощью lxml парсера
1
_nemo_
Программа получилась такая:

 from lxml import etree
# str name_html_file Имя HTML файла
# bool adm_mode = True Режим системного администрирования, выводится на экран только файл
# bool adm_mode = False Пользовательский режим, выводится на экран только переменные
# str tag_parser Тэг поиска в HTML файле, для text label должен быть '//a'
# str begin_reader Контрольная строка, с которой начинается запись массива. В массив не включается
# str end_reader Контрольная строка, которой заканчивается запись массива. В массив не включается
name_html_file = 'test4.html'
adm_mode = False
tag_parser = '//a'  # тэг для поиска, в данном случае <a>
print(name_html_file)
parser = etree.HTMLParser(remove_blank_text=True) # Задаем параметры парсера
page = etree.parse(name_html_file, parser) # Считываем файл в переменную page
if adm_mode == True:
    print('doc.encoding:    ' + page.docinfo.encoding)
    print(etree.tostring(page.getroot(),pretty_print=True,method='html',encoding='unicode')) # Распечатываем переменную page
if adm_mode == False:
    ft = etree.XPath(tag_parser)
    st = []
    for t in ft(page):
        if t.text != None:
            if t.text != ' ':
                if t.text.find('\t') == -1:
                    t.text = t.text.replace('\r','')
                    t.text = t.text.replace('\n','')
                    t.text = t.text.replace('  ',' ')
                    t.text = t.text.replace('  ',' ')
                    t.text = t.text.strip()
                    st.append(t.text)
    print(st)

Ищет тэги <a> в html.
Проблема вот в чем: некоторые файлы не удается отпарсить, несмотря на кодировку
исходников ‘utf-8’. Таких файлов немного, точнее один попался из нескольких десятков.
Выдает вот такие кракозябры:
'Ð\x9fеÑ\x80ейÑ\x82и к Ñ\x81одеÑ\x80жимомÑ\x83'

Вопрос: почему некоторые файлы в кодировке ‘utf-8’ читаются нормально, а некоторые нет?
FishHook
А пути случайно не в кириллице? В винде есть известная проблема с чтением файлов, если в адресе файла есть национальные символы.
_nemo_
FishHook
'''
А пути случайно не в кириллице? В винде есть известная проблема с чтением файлов, если в адресе файла есть национальные символы.
'''
Путей нет вообще, для тестовой отладке все в одной пвпке без путей, программа видит
файл и парсит его, но на выходе иногда кракозябры, но как правило все нормально.
Я логику понять не могу. Почему файлы в одной и той- же кодировке то читает, то не читает.
Полтергейст прямо какой- то…
_nemo_
FishHook

При чем, что характерно, latin-1 читает всегда нормально
Вот пример:
Ð\x9fÑ\x80оекÑ\x86иÑ\x8f повеÑ\x80Ñ\x85ноÑ\x81Ñ\x82и 4 оÑ\x81и - ноÑ\x80малÑ\x8c к STL модели', 'Ð\x9eпÑ\x83бликовано

STL прочиталось нормально…
FishHook
_nemo_
Путей нет вообще
У вас может быть кириллица в путях к стрипту, например, в имени пользователя, винда на этом месте (ну или питон в винде) тупит, когда получает доступ к файлу c:\users\вася иванов\питон\test, поэтому не нужно создавать таких путей, когда вы работаете с питоном в винде (да и вообще не нужно).
FishHook
И, кстати, а такая версия питона?
И вот здесь вместо юникода попробуйте указать вашу кодировку
 print(etree.tostring(page.getroot(),pretty_print=True,method='html',encoding='utf-8'))
_nemo_
FishHook

'''
У вас может быть кириллица в путях к стрипту
'''
пути нормальные, без кириллицы

'''
encoding='utf-8'
'''
пробовал уже, не помогает
_nemo_
Проблемы только с эти файлом
_nemo_
версия питона 3.4
_nemo_
Разобрался.
В том файле, который не парсился, не закрыт тэг head, соответтвенно не считывалась
metadata с кодировкой файла.
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