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!
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!
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'
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
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? –
@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. –
Essayez Beautiful Soup. Jetez tout sauf le texte.
>>> import re
>>> s = 'blah blah <a href="blah">link</a>'
>>> q = re.compile(r'<.*?>', re.IGNORECASE)
>>> re.sub(q, '', s)
'blah blah link'
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)
BeautifulSoup frappe aussi le même mur. Voir http://stackoverflow.com/questions/598817/python-html-removal/600471#600471 – jfs
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.
html2text fera quelque chose comme ceci.
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. –
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
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)
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 –
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! :)
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