2009-10-28 5 views
3

J'ai un fichier texte avec; utilisé comme délimiteur. Le problème est qu'il a une certaine mise en forme de texte html, comme > évidemment; Cela provoque des problèmes. Le fichier texte est volumineux et je n'ai pas de liste de ces chaînes html, il y a beaucoup d'exemples différents tels que $amp;. Comment puis-je les supprimer tous en utilisant python. Le fichier contient une liste de noms, d'adresses, de numéros de téléphone et de quelques autres champs. Je cherche le moduleSupprimer le formatage html ">" du fichier texte en utilisant Python csv.reader

+0

Il sera principalement composé de &, <, >. Ne va-t-il pas seulement trouver et remplacer suffisamment? Peut-être que vous pouvez créer une liste de tuples http://htmlhelp.com/reference/html40/entities/special.html et utiliser une fonction lambda pour trouver le remplacer dans votre fichier. – Jaskirat

Répondre

6

La façon la plus rapide est probablement d'utiliser les sans-papiers, mais jusqu'à présent stable méthode unescape dans HTMLParser:

import HTMLParser 
s= HTMLParser.HTMLParser().unescape(s) 

Notez ce sera nécessairement la sortie d'une chaîne Unicode, donc si vous avez des octets non-ASCII là vous devra d'abord s.decode(encoding).

+0

+1 bonne hack rapide – whatnick

3

crap.html.remove (textfile) Jetez un oeil sur le code de here:

import re, htmlentitydefs 

## 
# Removes HTML or XML character references and entities from a text string. 
# 
# @param text The HTML (or XML) source text. 
# @return The plain text, as a Unicode string, if necessary. 

def unescape(text): 
    def fixup(m): 
     text = m.group(0) 
     if text[:2] == "&#": 
      # character reference 
      try: 
       if text[:3] == "&#x": 
        return unichr(int(text[3:-1], 16)) 
       else: 
        return unichr(int(text[2:-1])) 
      except (ValueError, OverflowError): 
       pass 
     else: 
      # named entity 
      try: 
       text = unichr(htmlentitydefs.name2codepoint[text[1:-1]]) 
      except KeyError: 
       pass 
     return text # leave as is 
    return re.sub("&#?\w+;", fixup, text) 

Bien sûr, cela ne prend en charge les entités HTML. Vous pouvez avoir d'autres points-virgules dans le texte qui gâchent votre analyseur CSV. Mais je suppose que vous savez déjà que ...

MISE À JOUR: prise ajoutée pour possible OverflowError.

+0

je reçois une erreur /Users/cb/Dropbox/Marketing/Matériel Leads/formatleaddata.py dans removehtml (texte) 40 passe 41 congé de retour texte # tout comme ---> 42 re.sub de retour (» &#?\w+; ", correctif, texte) /Library/Frameworks/Python.framework/Versions/5.1.0/lib/python2.5/re.pyc dans sub (modèle, repl, chaîne, nombre) 148 si un appelable, c'est passé l'objet de correspondance et doit renvoyer 149 une chaîne de remplacement à utiliser. "" " -> 150 return _compile (motif, 0) .sub (repl, chaîne, nombre) 152 def subn (motif, repl, chaîne , count = 0): – Vincent

+0

C'est tout à fait une bouchée, et ce n'est pas clair pour moi quelle est l'erreur. Type de xception? Peut-être que vous devriez essayer de publier vos détails d'exception dans une réponse séparée, juste pour que nous puissions mettre en forme correctement. – itsadok

1

Sur la plupart des systèmes Unix (y compris Mac OS X), vous pouvez recoder le fichier texte d'entrée avec:

recode html.. file_with_html.txt 

Cette remplace & gt; par ">", etc.

Vous pouvez appeler ceci via le module de sous-processus de Python, par exemple.

Questions connexes