7
votes

Suppression des nœuds vides de HTML

Nous migrons d'un système de contenu en un autre et nous avons des tonnes de HTML où il existe des lignes, par exemple, comme ceci:

<p style="text-align: justify;"><i> </i></p>


2 commentaires

Hmm. Qu'en est-il des étiquettes structurelles vides? (DIVS pour une utilisation par JavaScript, par exemple)


Je pense que vous aurez besoin d'un analyseur HTML pour cela ...


4 Réponses :


3
votes

Dans le cas où le HTML est également un document XML bien formé (cela peut être effectué dans une pré-passe avec un outil tel que html-wardy ), cette transformation: xxx

lorsqu'il est appliqué sur un tel document XML - Par exemple: xxx

produit le résultat souhaité dans lequel n'importe quel élément dont la valeur de chaîne est vide ou que tout espace est supprimé : < / p> xxx


0 commentaires

2
votes

Si vous êtes sur une machine UNIX, ce script Python devrait fonctionner:

#!/usr/bin/python

import sys
import os
import subprocess
import tempfile

if len(sys.argv) < 2:
    sys.exit("usage: %s HTML_FILE" % sys.argv[0])

stylesheet = '''
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
      <xsl:template match="*[string-length(normalize-space(.)) = 0]"/>

      <xsl:template match="@*|node()">
         <xsl:copy>
           <xsl:apply-templates select="@*|node()"/>
         </xsl:copy>
      </xsl:template>

    </xsl:stylesheet>
'''

stylesheet_file = tempfile.NamedTemporaryFile(suffix='.xslt')
stylesheet_file.write(stylesheet)
stylesheet_file.flush()

p = subprocess.Popen("xsltproc --html %s %s" % (stylesheet_file.name, sys.argv[1]), 
        shell=True, stdout=subprocess.PIPE)

p.wait()
sys.stdout.write(p.stdout.read())
stylesheet_file.close()


0 commentaires

2
votes

Si le fichier HTML n'est pas valide XHTML, je vous suggère d'installer les packages magnifiquesUP4 et LXML et à l'aide du script suivant, qui supprime toutes les étiquettes sans contenu texte, puis lance les lignes vides de la sortie:

<html><head><title>Title</title></head><body>
<p class="title"><b>Something</b> here.
</p><p style="text-align: justify;">aaa<i> x</i><span>blah</span></p>
<p class="txt">Spam, spam, 
lovely spam.</p>
</body></html>


0 commentaires

0
votes
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl"
>
    <xsl:output method="xml" indent="yes"/>

    <xsl:template match="node()[normalize-space(.)]|@*">
      <xsl:copy>
        <xsl:apply-templates select="node()|@*"/>
      </xsl:copy>
    </xsl:template>

</xsl:stylesheet>

0 commentaires