Exclui todo o código dentro de uma tag em vários arquivos HTML com o Notepad ++

0

Preciso excluir todo o código contido em

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

incluindo as próprias tags <li> .

Existem várias outras tags <li> dentro da tag li class="share" , então não tenho certeza de como abordar isso. Estou usando o Notepad ++.

    
por RandyS 14.07.2015 / 06:58

1 resposta

0

Bem, abaixo está um código rapidamente lançado que parece funcionar bem para o exemplo de dados simples . Faça o que quiser com isso.

Sim, isso não é algo que você possa fazer com um simples "Localizar e substituir no bloco de notas", mesmo o Regex disponível em F & R em N ++ não oferece a capacidade de fazer isso ... ou é possível em Regex - Está bem além do meu nível. ;)

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*([\"'])(?:[^]*?\s+)?share(?:\s+[^]*?)?().*?>", 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)

Teste dados em 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>

Exemplo de execução:

$ 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>
    
por 14.07.2015 / 12:40