2010-06-13 11 views
1

Le contraire peut être réalisée à l'aide pyparsing comme suit:texte sauf bande du contenu d'une balise

from pyparsing import Suppress, replaceWith, makeHTMLTags, SkipTo 
#... 
removeText = replaceWith("") 
scriptOpen, scriptClose = makeHTMLTags("script") 
scriptBody = scriptOpen + SkipTo(scriptClose) + scriptClose 
scriptBody.setParseAction(removeText) 
data = (scriptBody).transformString(data) 

Comment pourrais-je garder le contenu de la balise "table"?

MISE À JOUR 0:

J'ai essayé: # garder uniquement les tables tableOpen, tableClose = makeHTMLTags ("table") tableBody = tableOpen + skipTo (tableClose) + tableClose f = replaceWith (tableBody) tableBody.setParseAction (f) data = (tableBody) .transformString (données) de données d'impression

et je reçois quelque chose comme ça ...

garbages 
<input type="hidden" name="cassstx" value="en_US:frontend"></form></td></tr></table></span></td></tr></table> 

{<"table"> SkipTo:(</"table">) </"table">} 
<div id="asbnav" style="padding-bottom: 10px;">{<"table"> SkipTo:(</"table">) </"table">} 
</div> 
even more garbages 

MISE À JOUR 2:

Merci Martelli. Ce que j'ai besoin est:

from pyparsing import Suppress, replaceWith, makeHTMLTags, SkipTo 
#... 
data = 'before<script>ciao<table>buh</table>bye</script>after' 

tableOpen, tableClose = makeHTMLTags("table") 
tableBody = tableOpen + SkipTo(tableClose) + tableClose 
thetable = (tableBody).searchString(data)[0][2] 

print thetable 

Répondre

1

Vous pouvez d'abord extraire la table (de façon similaire à la façon dont vous extraire maintenant le script, mais sans la suppression bien sûr ;-), l'obtention d'une chaîne thetable; puis, vous extrayez le script, replaceWith(thetable) au lieu de replaceWith(''). Alternativement, vous pouvez préparer une action d'analyse plus élaborée, mais l'approche simple en deux phases me semble plus simple. Par exemple. (Pour préserver spécifiquement les contenu du table, pas les tablebalises):

from pyparsing import Suppress, replaceWith, makeHTMLTags, SkipTo 
#... 
data = 'before<script>ciao<table>buh</table>bye</script>after' 

tableOpen, tableClose = makeHTMLTags("table") 
tableBody = tableOpen + SkipTo(tableClose) + tableClose 
thetable = (tableBody).searchString(data)[0][2] 

removeText = replaceWith(thetable) 
scriptOpen, scriptClose = makeHTMLTags("script") 
scriptBody = scriptOpen + SkipTo(scriptClose) + scriptClose 
scriptBody.setParseAction(removeText) 
data = (scriptBody).transformString(data) 

print data 

Cette imprime beforebuhafter (ce qui est en dehors de la balise de script, le contenu de la balise de table pris en sandwich à l'intérieur), nous l'espérons " comme voulu".

+0

Le problème est que je ne sais pas comment obtenir la chaîne 'thetable'. –

+1

@myle, voir ma modification avec un exemple. Ouais, les docs 'pyparsing' sont vraiment rares (sauf peut-être que vous êtes prêt à payer pour le livre O'Reilly je suppose) - seul défaut sérieux de ce paquet soigné! –

Questions connexes