2009-02-28 5 views
6

Comment puis-je supprimer tout le code HTML d'une chaîne en Python? Par exemple, comment puis-je tourner:Suppression de Python HTML

blah blah <a href="blah">link</a> 

dans

blah blah link 

Merci!

+0

Peut-être trop pour vos besoins, mais essayez BeautifulSoup si vos chaînes ont un code HTML plus compliqué ou mal formé. Avertissement: Je ne pense pas qu'il soit encore disponible pour Python 3.0. – bernie

Répondre

7

Vous pouvez utiliser une expression régulière pour supprimer tous les tags:

>>> import re 
>>> s = 'blah blah <a href="blah">link</a>' 
>>> re.sub('<[^>]*>', '', s) 
'blah blah link' 
+0

Vous pouvez simplifier votre expression rationnelle en '<.*?>', ce qui donnera les mêmes résultats, mais cela suppose un format HTML correctement formaté, tout comme le vôtre. – UnkwnTech

+0

Est-ce que vous devez vérifier pour les cotés>, ou ceux-ci ne sont-ils pas autorisés? Pouvez-vous avoir ou quelque chose? –

+0

@Unkwntech: Je préfère <[^>] *> sur <.*?> puisque le premier n'a pas besoin de revenir en arrière pour trouver la fin de l'étiquette. –

0
>>> import re 
>>> s = 'blah blah <a href="blah">link</a>' 
>>> q = re.compile(r'<.*?>', re.IGNORECASE) 
>>> re.sub(q, '', s) 
'blah blah link' 
18

Lorsque votre solution d'expression régulière frappe un mur, essayez ce super facile (et fiable) programme BeautifulSoup.

from BeautifulSoup import BeautifulSoup 

html = "<a> Keep me </a>" 
soup = BeautifulSoup(html) 

text_parts = soup.findAll(text=True) 
text = ''.join(text_parts) 
+0

BeautifulSoup frappe aussi le même mur. Voir http://stackoverflow.com/questions/598817/python-html-removal/600471#600471 – jfs

10

Il y a aussi une petite bibliothèque appelée stripogram qui peut être utilisé pour dépouiller une partie ou toutes les balises HTML.

Vous pouvez l'utiliser comme ceci:

from stripogram import html2text, html2safehtml 
# Only allow <b>, <a>, <i>, <br>, and <p> tags 
clean_html = html2safehtml(original_html,valid_tags=("b", "a", "i", "br", "p")) 
# Don't process <img> tags, just strip them out. Use an indent of 4 spaces 
# and a page that's 80 characters wide. 
text = html2text(original_html,ignore_tags=("img",),indent_width=4,page_width=80) 

Donc, si vous souhaitez supprimer simplement tous les fichiers HTML, vous passez valid_tags =() à la première fonction. Vous pouvez trouver le documentation here.

2

html2text fera quelque chose comme ceci.

+0

html2text est génial pour produire une sortie bien formatée et lisible sans étape supplémentaire. Si toutes les chaînes HTML que vous devez convertir sont aussi simples que votre exemple, alors BeautifulSoup est la voie à suivre. Si plus complexe, html2text fait un excellent travail de préserver l'intention lisible de l'original. –

5

regexs, BeautifulSoup, html2text ne fonctionnent pas si un attribut a '>' en elle. Voir Is “>” (U+003E GREATER-THAN SIGN) allowed inside an html-element attribute value?

« HTML/XML solution parser' basée peut aider dans de tels cas, par exemple, stripogramsuggested by @MrTopf fonctionne.

est ici ElementTree solution à base:

####from xml.etree import ElementTree as etree # stdlib 
from lxml import etree 

str_ = 'blah blah <a href="blah">link</a> END' 
root = etree.fromstring('<html>%s</html>' % str_) 
print ''.join(root.itertext()) # lxml or ElementTree 1.3+ 

Sortie:

blah blah link END 
1

Je viens d'écrire cela. J'en ai besoin. Il utilise html2text et prend un chemin de fichier, bien que je préférerais une URL. La sortie de html2text est stockée dans TextFromHtml2Text.text imprimez-la, stockez-la, alimentez-la à votre animal de compagnie canari.

import html2text 
class TextFromHtml2Text: 

    def __init__(self, url = ''): 
     if url == '': 
      raise TypeError("Needs a URL") 
     self.text = "" 
     self.url = url 
     self.html = "" 
     self.gethtmlfile() 
     self.maytheswartzbewithyou() 

    def gethtmlfile(self): 
     file = open(self.url) 
     for line in file.readlines(): 
      self.html += line 

    def maytheswartzbewithyou(self): 
     self.text = html2text.html2text(self.html) 
+0

Vous pouvez également écrire ceci comme 'urllib d'importation, html2text [pause] def get_text_from_html_url (url): [pause] retourner html2text.html2text (urllib.urlopen (url) .read())' plus court et plus propre –

1

Il y a une façon simple de:

def remove_html_markup(s): 
    tag = False 
    quote = False 
    out = "" 

    for c in s: 
      if c == '<' and not quote: 
       tag = True 
      elif c == '>' and not quote: 
       tag = False 
      elif (c == '"' or c == "'") and tag: 
       quote = not quote 
      elif not tag: 
       out = out + c 

    return out 

L'idée est expliquée ici: http://youtu.be/2tu9LTDujbw

Vous pouvez le voir travailler ici: http://youtu.be/HPkNPcYed9M?t=35s

PS - Si vous êtes intéressé par la classe (sur le débogage intelligent avec python) Je vous donne un lien: http://www.udacity.com/overview/Course/cs259/CourseRev/1. C'est gratuit!

De rien! :)

Questions connexes