Elimine todo el código dentro de una etiqueta en varios archivos HTML con Notepad++

Elimine todo el código dentro de una etiqueta en varios archivos HTML con Notepad++

Necesito eliminar todo el código contenido dentro

<li class="share"> ... </li>

incluidas las <li>propias etiquetas.

Hay muchas otras <li>etiquetas dentro de la li class="share"etiqueta, por lo que no estoy muy seguro de cómo abordar esto. Estoy usando el Bloc de notas++.

Respuesta1

Bueno, a continuación se muestra un código elaborado rápidamente que parece funcionar bien parasimpleejemplo de datos. Haz lo que quieras con él.

Sí, esto no es algo que puedas hacer con un simple Buscar y reemplazar en el Bloc de notas, incluso Regex disponible en F&R en N++ realmente no te da la posibilidad de hacerlo... O es posible en Regex: está mucho más allá de mi nivel. . ;)

import sys
import re

def get_tag():
    buffer = ""
    while True:
        c = sys.stdin.read(1)
        if not c:
            sys.stderr.write("Unexpected EOF\n")
            break
        buffer += c
        if c == '"' or c == "'":
            buffer += get_string(c)
        if c == '>':
            break
    return buffer

def get_string(quote = '"'):
    buffer = ""
    while True:
        c = sys.stdin.read(1)
        if not c:
            sys.stderr.write("Unexpected EOF\n")
            break
        buffer += c
        if c == quote and buffer[-2] != '\\':
            break
    return buffer


buffer = ""
skip_depth = 0

ul_begin = re.compile(r"<\s*li(?:>|\s+.*>)", re.IGNORECASE | re.DOTALL)
ul_begin_share = re.compile(r"<\s*li\s+.*class\s*=\s*([\"'])(?:[^\1]*?\s+)?share(?:\s+[^\1]*?)?(\1).*?>", re.IGNORECASE | re.DOTALL)
ul_end = re.compile(r"</\s*li\s*>", re.IGNORECASE)


while True:
    if skip_depth < 0:
        skip_depth = 0
    c = sys.stdin.read(1)
    if not c:
        #sys.stderr.write("EOF\n")
        break

    if c == '<':
        buffer = c + get_tag()

        if skip_depth > 0 and ul_begin.match(buffer):
            skip_depth += 1
        elif ul_begin_share.match(buffer):
            skip_depth += 1
        elif ul_end.match(buffer):
            skip_depth -= 1
            if skip_depth == 0:
                continue
        c = buffer

    if skip_depth > 0:
        pass
    else:
        sys.stdout.write(c)

Datos de prueba en data.html:

<ul>
    <li>do not touch that</li>
    <li id="whatever1">or that</li>
    <li class="share">delete this</li>
    <li class="foo-bar share">delete this</li>
    <li class="foobar share foo-bar_">delete this</li>
    <li class='share'>delete this</li>
    <li class='"wtf" share'>delete this</li>
    <li class=" share ">delete this</li>
    <li class="  share  ">delete this</li>
    <li class="foo share">delete this</li>
    <li class="share bar">delete this</li>
    <li class="foo share bar">delete this</li>
    <li class="long foo share short bar">delete this</li>
    <li class=" share ">delete this</li>
    <li class=" foo share bar ">delete this</li>
    <!-- but leave <li class="share">this comment</li> alone -->
    <li>This will stay</li>
    <li class="share">
        <li>delete this</li>
        <li>delete this</li>
    </li>
    <li style="not !important" class="share">delete this</li>
    <li>leave this, but
        <li class="share">
            <li>delete this</li>
            <li>delete this</li>
            <li>delete this</li>
            <li>delete this</li>
        </li>
    </li>
    <li class=" foo share bar ">delete this</li>
    <li class="shared">Can't touch this, naaaa-nanana...</li>
</ul>
<em>blablabla</em>

Ejecución de ejemplo:

$ python test.py < data.html > data.corrected.html
$ cat data.corrected.html
<ul>
    <li>do not touch that</li>
    <li id="whatever1">or that</li>













    <!-- but leave <li class="share">this comment</li> alone -->
    <li>This will stay</li>


    <li>leave this, but

    </li>

    <li class="shared">Can't touch this, naaaa-nanana...</li>
</ul>
<em>blablabla</em>

información relacionada