2017-07-21 3 views
0

Ich habe eine reine HTML-Datei sieht wie folgt aus (Inhalt von Zeit zu Zeit ändern können, wissen wir alle, dass es eine gültige HTML-Datei ist):Markieren Sie Text in HTML programmaticly

<HTML> 
    <BODY> 
     <h1>Hello World</h1> 
     <p> 
      This is my paragraph 
     </p> 
     <div> 
      another text 
     </div> 
    </BODY> 
</HTML> 

Wenn ich es in Browser öffnen Es sieht so aus: Original file

Jetzt möchte ich einige Textteile innerhalb dieser HTML-Datei hervorheben. Nehmen wir an, ich möchte den Text markieren: "Welt Dies ist mein Absatz ein anderes".

Erwartete Ausgabe:

<HTML> 
    <BODY> 
     <h1>Hello <mark>World</mark></h1> 
     <p> 
      <mark>This is my paragraph</mark> 
     </p> 
     <div> 
      <mark>another</mark> text 
     </div> 
    </BODY> 
</HTML> 

Expected output

Sie haben:

  • Raw HTML-Datei (wie oben dargestellt)
  • Ein Satz, der Sie sicher wissen, dass innerhalb der erscheinen Textversion des HTML. Beachten Sie, dass dieser Satz in mehreren HTML-Knoten platziert werden kann (wie im obigen Beispiel. Übergeordnete Knoten: h1, p und div).
  • Eine Python-Script-Skriptdatei zur Automatisierung des Hervorhebungsvorgangs.

Ich dachte, dass Regex ein guter Ort ist, um nach einer Lösung zu suchen. Aber ich steckte fest, sobald ich ein Szenario betrete, in dem der Text mit mehreren Eltern geteilt wird. Darüber hinaus können weitere Elemente zwischen den Wörtern platziert werden (z. B. img).

Auf der Suche nach einem Hinweis, wo die Lösung zu finden?

+0

Ihre Frage ist ** ** unklar, ob A) Sie uns wollen, sind das Programm für Sie zu schreiben, was ** zu breit ** ist (und in der Regel verpönt, auch wenn schmal genug, um nicht zu sein breit, da SO kein Code-Schreibdienst ist); B) eine Anfrage an uns, um eine Bibliothek zu finden, die dies tut, was eine Anfrage für externe Ressourcen ist, die ** off-topic: Ressourcenanfrage ** ist; oder C) eine Anfrage zum Debuggen Ihres Codes, die ** off-topic: no MCVE ** ist, es sei denn, Sie bieten alles, was für das Debuggen von Fragen in [Hilfe/on-topic], einschließlich eines [MCVE], aber Sie bereitgestellt haben Kein Code, obwohl du gesagt hast, dass du es versucht hast. – Makyen

Antwort

0

Gute Software für diesen Zweck ist [BeautifulSoup]. 1 Verwenden Sie die Methode replace_with, um Zeichenfolgen oder Tags zu ersetzen. Verwenden Sie die Methode new_tag, um ein Tag zu erstellen, das anstelle eines vorhandenen Tags eingefügt wird. Beginne damit, "Suppe" aus dem vorhandenen HTML zu machen. Es gibt viele Beispiele von Manipulationen, die BeautifulSoup über das gesamte Netz betreffen.

Dieser Beispielcode zeigt, wie Sie mit dem ersten Vorkommen von "Hallo Welt" in Ihrem HTML umgehen.

>>> import bs4 
>>> soup = bs4.BeautifulSoup(open('temp.htm').read(), 'lxml') 
>>> new_h1 = soup.new_tag('h1') 
>>> new_h1.string = 'Hello ' 
>>> mark = soup.new_tag('mark') 
>>> mark.string = 'World' 
>>> mark 
<mark>World</mark> 
>>> new_h1.append(mark) 
>>> new_h1 
<h1>Hello <mark>World</mark></h1> 
>>> h1 = soup.h1 
>>> h1.replace_with(new_h1) 
<h1>Hello World</h1> 
>>> for line in soup.prettify().split('\n'): 
...  line 
...  
'<html>' 
' <body>' 
' <h1>' 
' Hello' 
' <mark>' 
' World' 
' </mark>' 
' </h1>' 
' <p>' 
' This is my paragraph' 
' </p>' 
' <div>' 
' another text' 
' </div>' 
' </body>' 
'</html>' 
0

Vielleicht würde ich beautifulsoup, um alle Kinder in den Body-Tags zu erhalten (lassen Körper der Eltern sein) nach

https://www.crummy.com/software/BeautifulSoup/bs3/documentation.html#contents Link mehr Informationen enthalten alle NavigableString bekommen.

Sie können dann die Zeichenkette (Inhalt) mit dem Markierungstag <mark> Content </mark> rekonstruieren, weil Sie den Inhalt und die Markierung von der schönen Suppe extrahieren und die wieder hergestellte Schnur zurück setzen können.regex ist zu viel Schmerz

Oder Sie können einige Rekursion auf der HTML-Baumstruktur verwenden, tun (tun das nicht) regex eine schmutzige Lösung sicher ist

0

Als Hinweis:


Schritt 1: Ersetzen Sie alle Schlüssel% und speichern Sie die ersetzt Tag in der Liste

s1 = %%%Hello World%%This is my paragraph%%%%another%text%%%  
tags = ['<HTML>','<body>,<h1>,</h1>,<p> , ...] 

Schritt 2: suchen Sie die Regex in s1

World(\s|%)+This(\s|%)+is(\s|%)+my(\s|%)+paragraph(\s|%)+another 

Schritt 3: Legen Sie <mark> am Anfang des Spiels und </mark> am Ende. Fügen Sie für jede% Gruppe </mark> vor der Gruppe und <mark> am Ende der Gruppe ein.

%%%Hello <mark>World</mark>%%<mark>This is my paragraph</mark>%%%%<mark>another</mark>%text%%% 

Schritt 4: Nun, stellen Sie die Tags aus der Liste der Tag-Liste.

<HTML><body><h1>Hello <mark>World</mark></h1><p><mark>This is my paragraph</mark></p> ... 
Verwandte Themen