Страницы

Поиск по вопросам

четверг, 23 января 2020 г.

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

#html #python #xpath


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

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

    


Ответы

Ответ 1



Я бы из стандартного использовал бы регулярки. Используя модуль lxml, можно так: from lxml import html html_code = 'Заголовок' xpath = '//title' root = html.fromstring(html_code) print(html.tostring(root)) # b'Заголовок' for el in root.xpath(xpath): parent = el.getparent() parent.remove(el) print(html.tostring(root)) # b''

Ответ 2



Чистый xpath запрос не получится, потому что функция selectNodes выбирает Nod-ы из одного уровня xml, и фильтр можно поставить только на весь уровень. Но можно сделать, например, SelectNodes('/*/*[name(*/.)!="title"]') что выберет "второй" уровень (т.к. первый "root" т.е. весь документ тег html), при этом будет отброшена вся ветка head, от этого вы никак не уйдёте, т.к. если выбрать третий уровень - елементы второго уровня где нету третьего "уйдут" потеряются данные. Пример тут http://stackoverflow.com/questions/36260599/xpath-search-within-xpath-results Вариант 2. Можно использовать трансформацию xsl + xpath с рекурсией. Скрипт трансформации будет примерно такой: Базируется на функции copyif которая клонирует ноды, плюс в if - условие копирование (c которыи прийдётся помучатся, сравнение полного пути xpath 3.0 поддерживает). Шапку можно и 1.0, функции "базовые". Запрос большой, зато на питоне будет две-три строчки - загрузить два xml и сделать transform. это не самый лучший метод, но может пригодится как пример обращения с xml.

Комментариев нет:

Отправить комментарий