4

Je suis confronté à des problèmes avec les caractères spéciaux tels que ° et ® qui représentent le degré signe Fahrenheit et le signe enregistré,Comment supprimer les caractères spéciaux de la sortie de BeautifulSoup?

quand j'imprime la chaîne que contient les caractères spéciaux, il donne une sortie comme ceci:

Preheat oven to 350° F 
Welcome to Lorem Ipsum Inc® 

Existe-t-il un moyen de produire les caractères exacts et non leurs codes? S'il vous plaît, faites-moi savoir.

+2

Pouvez-vous un peu de code que nous pouvons exécuter qui illustre le problème? –

+1

-1 pour ne pas inclure le code _any_. – hop

+1

Vous devriez supprimer le code que vous avez mis dans les commentaires ci-dessous et le mettre dans votre question à la place; vous devriez également le marquer comme code pour qu'il s'affiche correctement (sélectionnez le bloc et appuyez sur Ctrl + K). J'ai pris la liberté d'éditer votre message un peu. –

Répondre

8
$ python -c'from BeautifulSoup import BeautifulSoup 
> print BeautifulSoup("""<html>Preheat oven to 350&deg; F 
> Welcome to Lorem Ipsum Inc&reg;""", 
> convertEntities=BeautifulSoup.HTML_ENTITIES).contents[0].string' 
Preheat oven to 350° F 
Welcome to Lorem Ipsum Inc® 
+0

désolé, s'il vous plaît ne vous méprenez pas, tout ce que je veux, c'est obtenir les symboles, de l'inscrit et le degré Celsius. Je vais essayer celui mentionné ci-dessus. – Suhail

+0

Merci Sebastian qui a résolu mon problème, et merci David pour coopérer avec moi. – Suhail

0

Je pense quelque part, un programme indique & deg et & reg sans un point-virgule. Essayez d'utiliser "& deg" + ";" et "& reg" + ";" dans votre fichier HTML, s'il s'agit bien d'un fichier HTML. Et s'il vous plaît expliquer le contexte.

+0

Tout le scénario est comme ceci: je récupère des données d'une page html à travers une URL, et j'utilise le module BeautifulSoup une fois que je reçois les données, je reçois les données dans ma variable et ensuite le convertis en format chaîne. dataText = str (dataText) et quand j'imprime: print dataText je reçois la sortie comme: Préchauffer le four à 350 & deg F je dois obtenir ce symbole exact – Suhail

2

Voici un script qui, pour l'effacement tolérant des références HTML à partir de pages Web, suppose que les références sont, par ex. en &deg; format avec un point-virgule après eux cependant (Preheat oven to 350&deg; F par exemple):

from htmlentitydefs import name2codepoint 

# Get the whitespace characters 
nums_dict = {0: ' ', 1: '\t', 2: '\r', 3: '\n'} 
chars_dict = dict((x, y) for y, x in nums_dict.items()) 
nums_dict2XML = {0: '&#32;', 1: '&#09;', 2: '&#13;', 3: '&#10;'} 
chars_dict2XML = dict((nums_dict[i], nums_dict2XML[i]) for i in nums_dict2XML) 

s = '1234567890ABCDEF' 
hex_dict = {} 
for i in s: 
    hex_dict[i.lower()] = None 
hex_dict[i.upper()] = None 
del s 

def is_hex(s): 
    if not s: 
     return False 

    for i in s: 
     if i not in hex_dict: 
      return False 
    return True 

class Unescape: 
    def __init__(self, s, ignore_whitespace=False): 
     # Converts HTML character references into a unicode string to allow manipulation 
     self.s = s 
     self.ignore_whitespace = ignore_whitespace 
     self.lst = self.process(ignore_whitespace) 

    def process(self, ignore_whitespace): 
     def get_char(c): 
      if ignore_whitespace: 
       return c 
      else: 
       if c in chars_dict: 
        return chars_dict[c] 
       else: return c 

     r = [] 
     lst = self.s.split('&') 
     xx = 0 
     yy = 0 
     for item in lst: 
      if xx: 
       split = item.split(';') 
       if split[0].lower() in name2codepoint: 
        # A character reference, e.g. '&amp;' 
        a = unichr(name2codepoint[split[0].lower()]) 
        r.append(get_char(a)) # TOKEN CHECK? 
        r.append(';'.join(split[1:])) 

       elif split[0] and split[0][0] == '#' and split[0][1:].isdigit(): 
        # A character number e.g. '&#52;' 
        a = unichr(int(split[0][1:])) 
        r.append(get_char(a)) 
        r.append(';'.join(split[1:])) 

       elif split[0] and split[0][0] == '#' and split[0][1:2].lower() == 'x' and is_hex(split[0][2:]): 
        # A hexadecimal encoded character 
        a = unichr(int(split[0][2:].lower(), 16)) # Hex -> base 16 
        r.append(get_char(a)) 
        r.append(';'.join(split[1:])) 

       else: 
        r.append('&%s' % ';'.join(split)) 
      else: 
       r.append(item) 
      xx += 1 
      yy += len(r[-1]) 
     return r 

def get_value(self): 
    # Convert back into HTML, preserving 
    # whitespace if self.ignore_whitespace is `False` 
    r = [] 
    for i in self.lst: 
     if type(i) == int: 
      r.append(nums_dict2XML[i]) 
     else: 
      r.append(i) 
    return ''.join(r) 

def unescape(s): 
    # Get the string value from escaped HTML `s`, ignoring 
    # explicit whitespace like tabs/spaces etc 
    inst = Unescape(s, ignore_whitespace=True) 
    return ''.join(inst.lst) 

if __name__ == '__main__': 
    print unescape('Preheat oven to 350&deg; F') 
print unescape('Welcome to Lorem Ipsum Inc&reg;') 

EDIT: Voici une solution simple qui ne fait que remplacer les références de caractères avec des caractères et non &#xx; références:

from htmlentitydefs import name2codepoint 

def unescape(s): 
    for name in name2codepoint: 
     s = s.replace('&%s;' % name, unichr(name2codepoint[name])) 
    return s 

print unescape('Preheat oven to 350&deg; F') 
print unescape('Welcome to Lorem Ipsum Inc&reg;') 
+0

non non, ce n'est pas comme ça, laissez-moi vous montrer le code: – Suhail

+0

recipeDiv ​​= BeautifulSoup.findAll ('div', attrs = {'id': 'préparation'}) recipeDiv ​​= str (recipeDiv) RecetteDiv = BeautifulSoup (RecetteDiv) RN = len (RecipeDiv ​​('p')) y = 0 tout (y Suhail

+0

quand j'imprimer la recipeDivText je reçois la sortie comme: Préchauffer le four à 350 ° F – Suhail

1

Dans la belle soupe 4:

my_text = """Preheat oven to 350&deg; F 
Welcome to Lorem Ipsum Inc&reg; """ 

soup = BeautifulSoup(my_text, 'html.parser') 

print(soup) 

Résultat:

Preheat oven to 350° F 
Welcome to Lorem Ipsum Inc® 
+0

Génial! Considérez 'print (soupe)', avec des parenthèses, pour être compatible avec Python 2 & 3. – kkurian

+0

Bon appel. Merci. –

Questions connexes