LINUX.ORG.RU

Итераторы в lxml

 , ,


0

1

Есть сохранённые файлы HTML, в которых много ненужного: джаваскрипты, стили, SVG… Пытаюсь удалить.

Я попробовал так:

import lxml.html
h = lxml.html.parse('page001.html')
root = h.getroot()
for e in root.iter():
    if type(e.tag) != str:
        e.drop_tree()
    if e.tag in ('link', 'script', 'svg', 'footer', 'style') and ... e.attrib ... :
        e.drop_tree()

И затем посмотрел результат print(lxml.etree.tostring(root, pretty_print=True).decode())

В результате удалились линки и скрипты из секции head (например, root[0][12]), но не удалился SVG из глубин body (root[1][0][1][3][0][0][0][2][0][0][0]).

Немного покопавшись, понял: нельзя удалять элементы массива, по которому идёт for от начала к концу (в обратном направлении — можно). Но тогда почему это работало для первых элементов?

★★★★★

Последнее исправление: question4 (всего исправлений: 2)
    if type(e.tag) != str:

Так типы в Python не проверяются. Правильно:

    if isinstance(e.tag, str):

Вместо изобретения своего велосипеда, рекомендую обратить внимание на приблизительно десяток библиотек с подобной функциональностью. html-sanitizer, bleach, и т.д. и т.п.

Chiffchaff
()
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.