Уведомления

Группа в Telegram: @pythonsu

#1 Янв. 3, 2017 16:49:02

_nemo_
Зарегистрирован: 2017-01-02
Сообщения: 34
Репутация: +  1  -
Профиль   Отправить e-mail  

Парсинг html с помощью lxml парсера

Программа получилась такая:

 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’ читаются нормально, а некоторые нет?

Офлайн

#2 Янв. 3, 2017 18:00:42

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Парсинг html с помощью lxml парсера

А пути случайно не в кириллице? В винде есть известная проблема с чтением файлов, если в адресе файла есть национальные символы.



Офлайн

#3 Янв. 3, 2017 18:30:27

_nemo_
Зарегистрирован: 2017-01-02
Сообщения: 34
Репутация: +  1  -
Профиль   Отправить e-mail  

Парсинг html с помощью lxml парсера

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

Офлайн

#4 Янв. 3, 2017 18:35:51

_nemo_
Зарегистрирован: 2017-01-02
Сообщения: 34
Репутация: +  1  -
Профиль   Отправить e-mail  

Парсинг html с помощью lxml парсера

FishHook

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

STL прочиталось нормально…

Офлайн

#5 Янв. 3, 2017 18:56:10

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Парсинг html с помощью lxml парсера

_nemo_
Путей нет вообще
У вас может быть кириллица в путях к стрипту, например, в имени пользователя, винда на этом месте (ну или питон в винде) тупит, когда получает доступ к файлу c:\users\вася иванов\питон\test, поэтому не нужно создавать таких путей, когда вы работаете с питоном в винде (да и вообще не нужно).



Отредактировано FishHook (Янв. 3, 2017 18:57:53)

Офлайн

#6 Янв. 3, 2017 19:00:32

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Парсинг html с помощью lxml парсера

И, кстати, а такая версия питона?
И вот здесь вместо юникода попробуйте указать вашу кодировку

 print(etree.tostring(page.getroot(),pretty_print=True,method='html',encoding='utf-8'))



Офлайн

#7 Янв. 3, 2017 19:25:12

_nemo_
Зарегистрирован: 2017-01-02
Сообщения: 34
Репутация: +  1  -
Профиль   Отправить e-mail  

Парсинг html с помощью lxml парсера

FishHook

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

'''
encoding='utf-8'
'''
пробовал уже, не помогает

Офлайн

#8 Янв. 3, 2017 19:28:57

_nemo_
Зарегистрирован: 2017-01-02
Сообщения: 34
Репутация: +  1  -
Профиль   Отправить e-mail  

Парсинг html с помощью lxml парсера

Проблемы только с эти файлом

Прикреплённый файлы:
attachment test4.html (282,3 KБ)

Офлайн

#9 Янв. 3, 2017 19:30:32

_nemo_
Зарегистрирован: 2017-01-02
Сообщения: 34
Репутация: +  1  -
Профиль   Отправить e-mail  

Парсинг html с помощью lxml парсера

версия питона 3.4

Офлайн

#10 Янв. 3, 2017 23:16:32

_nemo_
Зарегистрирован: 2017-01-02
Сообщения: 34
Репутация: +  1  -
Профиль   Отправить e-mail  

Парсинг html с помощью lxml парсера

Разобрался.
В том файле, который не парсился, не закрыт тэг head, соответтвенно не считывалась
metadata с кодировкой файла.

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version