Уведомления

Группа в Telegram: @pythonsu

#1 Май 12, 2014 13:31:11

tfox
Зарегистрирован: 2012-04-13
Сообщения: 55
Репутация: +  0  -
Профиль   Отправить e-mail  

Удалить кусок html используя xpath

Всем привет
Задача может быть и простая но я с таким не сталкивался.
Как из html-кода удалить определенный узел? Используя xpath шаблон.
Ниже примерно описал алгоритм. Не знаю только библиотеку и функцию который выполнили эту операцию


import "какая_нибудь_стандартная_библиотека"
html_code = '<html><head><title>Заголовок</title></head> и так далее ...</html>'
xpath_parrent = '//title'
result = "функция_удалить"(html_code, xpath_parrent)
# теперь узла title больше нету
# можно выводить на экран
print title

Отредактировано tfox (Май 12, 2014 13:32:01)

Офлайн

#2 Май 12, 2014 13:55:24

GreyZmeem
От: Киев
Зарегистрирован: 2013-12-03
Сообщения: 147
Репутация: +  34  -
Профиль   Отправить e-mail  

Удалить кусок html используя xpath

Используйте lxml или xml.etree.ElementTree чтобы конвертировать ваш текст в xml.
После чего можно найти нужный вам элемент и удалить.

Офлайн

#3 Май 12, 2014 14:09:10

tfox
Зарегистрирован: 2012-04-13
Сообщения: 55
Репутация: +  0  -
Профиль   Отправить e-mail  

Удалить кусок html используя xpath

GreyZmeem
После чего можно найти нужный вам элемент и удалить.

А как найти элемент и удалить его?

Офлайн

#4 Май 12, 2014 14:19:53

GreyZmeem
От: Киев
Зарегистрирован: 2013-12-03
Сообщения: 147
Репутация: +  34  -
Профиль   Отправить e-mail  

Удалить кусок html используя xpath

Офлайн

#5 Май 12, 2014 15:33:18

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10016
Репутация: +  857  -
Профиль   Отправить e-mail  

Удалить кусок html используя xpath

GreyZmeem
или xml.etree.ElementTree чтобы конвертировать ваш текст в xml.
для разбора html модуль xml не применяют, так как html не преобразуется в xml
в xml не допускаются незакрытые теги

поэтому там вариант только lxml.html

>>> import lxml.html
>>> 
>>> s = '<html><head><title>test</title></head></html>'
>>> 
>>> doc = lxml.html.fromstring(s)
>>> node = doc.xpath('//title')
>>> node[0].getparent().remove(node[0])
>>> lxml.html.tostring(doc)
b'<html><head></head></html>'
>>>



Отредактировано py.user.next (Май 12, 2014 15:47:18)

Офлайн

#6 Май 12, 2014 16:14:36

tfox
Зарегистрирован: 2012-04-13
Сообщения: 55
Репутация: +  0  -
Профиль   Отправить e-mail  

Удалить кусок html используя xpath

py.user.next
для разбора html модуль xml не применяют, так как html не преобразуется в xml
в xml не допускаются незакрытые теги

Это точно. Об этот lxml все копья сломал.

py.user.next
node.getparent().remove(node)

Подскажите. А как пройтись по всем узлам?

Офлайн

#7 Май 12, 2014 16:27:26

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10016
Репутация: +  857  -
Профиль   Отправить e-mail  

Удалить кусок html используя xpath

tfox
Подскажите. А как пройтись по всем узлам?
нужно через xpath найти родительский, а затем удалить его дочерние узлы



Офлайн

#8 Май 12, 2014 16:27:49

tfox
Зарегистрирован: 2012-04-13
Сообщения: 55
Репутация: +  0  -
Профиль   Отправить e-mail  

Удалить кусок html используя xpath

До петрив. Вот таким циклом можно.

    doc = lxml.html.fromstring(a_text)
    node = doc.xpath('//h2')
    for i in node:
        i.getparent().remove(i)

Офлайн

#9 Май 12, 2014 16:28:39

tfox
Зарегистрирован: 2012-04-13
Сообщения: 55
Репутация: +  0  -
Профиль   Отправить e-mail  

Удалить кусок html используя xpath

py.user.next
Спасибо Вам.

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version