2017-07-06 4 views
0

Ich benutze Python und möchte alle HTML-Tags aus einer Zeichenfolge entfernen, die nicht in bestimmten Tags enthalten sind. In diesem Beispiel möchte ich alle HTML-Tags entfernen, die nicht in den <header> Tags </header> enthalten sind, und auch das umschließende Tag nicht entfernen.Python Regex, um alle Tags zu entfernen, die nicht zwischen zwei anderen Tags sind

Zum Beispiel:

<h1>Morning</h1> 
<header> 
    <h1>Afternoon</h1> 
    <h2>Evening</h2> 
</header> 
<h2>Night</h2> 

Ergebnis:

Morning 
<header> 
    <h1>Afternoon</h1> 
    <h2>Evening</h2> 
</header> 
Night 

Ich habe dafür ausgegeben Stunden, aber ohne Glück. Ich weiß, der alle folgenden Tags finden:

re.sub('<.*?>', '', mystring) 

Und das wird alles innerhalb der Header-Tags finden:

re.sub('<header>.*?</header>', '', mystring) 

Aber wie mache ich es zu negieren, so dass die erste Regex was ignoriert die zweite Regex findet? Jede Hilfe wird sehr geschätzt! Vielen Dank! :)

+7

nicht regex Verwenden Sie HTML zu verarbeiten (https://stackoverflow.com/questions/701166/can-you-provide-some-examples- of-warum-es-ist-schwer-zu-xml-und-html-mit-a-reg zu parsen. Lernen Sie Beautifulsoup zu benutzen und Ihr Leben viel einfacher zu machen. –

+0

Ich benutze es, um HTML-Dokumente zu verarbeiten, die in einem sehr spezifischen Format sind (jedes Dokument ist das exakt gleiche Format und hat viele strenge Regeln, was geschrieben wird), also wird es keine dieser wilden HTML-Tags innerhalb von Tags und so weiter geben Ich brauche das so schnell wie möglich, so dass ich momentan keine Zeit habe, aber in naher Zukunft definitiv lernen werde, Beautifulsoup zu benutzen! – cullan

+1

@cullan Ich empfehle wirklich BS4. Alles was es braucht, ist eine schnelle 'pip install beautifulsoup4' gefolgt von der Ausführung des Codes in meiner Antwort. :) –

Antwort

3

Sie können dies schnell und einfach mit BeautifulSoup tun, wie von Josep Valls in den Kommentaren erwähnt. Hier ist, wie:

from bs4 import BeautifulSoup 

soup = BeautifulSoup('''<h1>Morning</h1> 
<header> 
    <h1>Afternoon</h1> 
    <h2>Evening</h2> 
</header> 
<h2>Night</h2>''', 'html.parser') 

for tag in soup.find_all(recursive=False): 
    if not tag.findChildren(): 
     tag.unwrap() 

print(soup) 

Dies gibt:

Morning 
<header> 
<h1>Afternoon</h1> 
<h2>Evening</h2> 
</header> 
Night 
+0

hey COLDSPEED, vielen Dank für Ihre Hilfe, aber können Sie Ihre Antwort ändern, um mir mit meiner modifizierten Frage zu helfen? sehr geschätzt :) – cullan

+0

@cullan Ich würde gerne helfen, aber eine Frage zu modifizieren und den Kontext komplett neu zu setzen ist keine gute Idee und ist nicht hilfreich für zukünftige Leser. Könnten Sie bitte eine neue Frage stellen? –

+0

@culan Kopiere deine aktuelle Frage und rolle dann deine Änderungen zurück. Dann posten Sie eine neue Frage. –

Verwandte Themen