2010-05-02 9 views
2

J'utilise cette expression rationnelle sur une entrée,Conversion des entités html dans leurs valeurs en python

[^[email protected]#] 

Cependant, cela finit par enlever beaucoup de caractères spéciaux de HTML dans l'entrée, telles que

#227;, #1606;, #1588; (i had to remove the & prefix so that it wouldn't 
show up as the actual value..) 

est y a-t-il un moyen de les convertir à leurs valeurs afin qu'elles satisfassent l'expression de l'expression rationnelle? Je ne sais pas non plus pourquoi le texte a décidé d'être si grand.

+0

Vous pouvez avoir remplacé le préfixe et avec & –

+0

Pouvez-vous montrer l'expression rationnelle avec un certain contexte? Votre exemple ci-dessus correspond juste à n'importe quel caractère qui n'est pas un de ces caractères. Est-ce que cela fait partie d'une plus grande expression? Remplacez-vous les caractères? –

+0

J'ai formaté votre texte sous forme de code pour qu'il ne soit plus aussi gros ;-). –

Répondre

4

Étant donné que votre texte semble avoir numérique-codé, non nommé, les entités, vous pouvez d'abord convertir votre chaîne d'octets qui inclut l'entité xml defs (esperluette, hachage, chiffres, virgule) à unicode:

import re 
xed_re = re.compile(r'&#(\d+);') 
def usub(m): return unichr(int(m.group(1))) 

s = 'ã, ن, ش' 
u = xed_re.sub(usub, s) 

si votre émulateur de terminal peut afficher glyphes unicode arbitraires, un print u montrera alors

ã, ن, ش 

Dans tous les cas, vous pouvez maintenant, Si vous le souhaitez, utilisez votre RE d'origine et vous ne pas "attraper" accidentellement les entités, seulement les lettres ascii, les chiffres, et le couple de caractères de ponctuation que vous avez énumérés. (Je ne suis pas sûr que ce soit ce que vous voulez vraiment - pourquoi pas des lettres accentuées, mais seulement des lettres ascii, par exemple?), Mais si est ce que vous voulez, cela fonctionnera).

Si vous faites ont nommé des entités en plus de ceux numériques codés, vous pouvez également appliquer le module de bibliothèque standard htmlentitydefs recommandé dans une autre réponse (il ne traite que des entités nommées qui carte au code Latin-1 points, cependant).

0

Sans savoir à quoi l'expression est utilisée, je ne peux pas dire exactement ce dont vous avez besoin.

Cela correspondra des caractères spéciaux ou des chaînes de caractères à l'exclusion des lettres, des chiffres, @ et #:

[^[email protected]#]*|#[0-9A-Za-z]+; 
1

Vous pouvez adapter le script suivant:

import htmlentitydefs 
import re 

def substitute_entity (match): 
    name = match.group (1) 
    if name in htmlentitydefs.name2codepoint: 
     return unichr (htmlentitydefs.name2codepoint[name]) 
    elif name.startswith ('#'): 
     try: 
      return unichr (int (name[1:])) 
     except: 
      pass 

    return '?' 

print re.sub ('&(#?\\w+);', substitute_entity, 'x « y &wat; z {') 

Produit ici la réponse suivante:

x « y ? z { 

EDIT: J'ai compris la question comme "comment se débarrasser des entités HTML b vant un traitement ultérieur », espère que je ne l'ai pas du temps perdu à répondre à une mauvaise question;)

Questions connexes