Me gustaría extraer el texto de un archivo HTML usando Python. Quiero esencialmente el mismo resultado que me gustaría conseguir si he copiado el texto de un navegador y pegar en el bloc de notas.

Me gustaría algo más robusto que el uso de expresiones regulares que pueden fallar en poco formado en HTML. He visto a mucha gente recomienda la Sopa de Hermosa, pero he tenido un par de problemas al utilizarlo. Para uno, lo recogió de texto no deseados, tales como fuente de JavaScript. Asimismo, no interpretar entidades HTML. Por ejemplo, yo esperaría ' en el código fuente HTML para convertirse en un apóstrofo en el texto, como si me hubiera pegado el navegador de contenido en el bloc de notas.

Actualización html2text parece prometedor. Se encarga de entidades HTML correctamente y hace caso omiso de JavaScript. Sin embargo, no exactamente producir texto sin formato; produce reducción del precio que tendría que ser convertida en texto sin formato. No viene con ejemplos o documentación, pero el código se ve limpio.


Preguntas relacionadas:

  • Durante bastante tiempo, la gente parece ser la búsqueda de mi NLTK respuesta (bastante reciente) para ser extremadamente útil es así, usted puede ser que desee considerar el cambio de la aceptación de la respuesta. Gracias!
  • Nunca pensé que podría venir a través de una pregunta formulada por el autor de mi blog favorito! El Esfuerzo!
  • Ahora que su solución se ha convertido ya no es válido, puede que desee borrar tu comentario. Gracias! 😉
InformationsquelleAutor John D. Cook | 2008-11-30

31 Comentarios

  1. 120

    html2text es un programa en Python que hace un trabajo bastante bueno en esto.

    • poco es gpl 3.0 que significa que puede ser incompatible
    • Increíble! es autor es RIP Aaron Swartz.
    • ¿Alguien encontrar alternativas a las html2text porque la GPL 3.0?
    • La GPL no es tan malo como la gente quiere que sea. Aaron sabía mejor.
    • He intentado tanto html2text y nltk pero no funciona para mí. Terminé yendo con la Sopa de Hermosa 4, que funciona de maravilla (sin juego de palabras).
    • Estoy buscando un módulo para este. Es que lo que html2text es?
    • Esto no parece funcionar, cualquier actualización o sugerencias?
    • Sé que no es (del TODO) el lugar, pero me sigue el enlace para Aarón el blog y perfil de github y proyectos, y me encontré muy perturbado por el hecho de que no hay mención de su muerte y es de curso congelado en 2012, como si el tiempo se detuvo o se tomó un muy largas vacaciones. Muy preocupante.
    • Oficial de la horquilla está en github.com/Alir3z4/html2text

  2. 126

    La mejor pieza de código que he encontrado para la extracción de texto sin llegar javascript o no quería que las cosas :

    import urllib
    from bs4 import BeautifulSoup
    
    url = "http://news.bbc.co.uk/2/hi/health/2284783.stm"
    html = urllib.urlopen(url).read()
    soup = BeautifulSoup(html)
    
    # kill all script and style elements
    for script in soup(["script", "style"]):
        script.extract()    # rip it out
    
    # get text
    text = soup.get_text()
    
    # break into lines and remove leading and trailing space on each
    lines = (line.strip() for line in text.splitlines())
    # break multi-headlines into a line each
    chunks = (phrase.strip() for line in lines for phrase in line.split("  "))
    # drop blank lines
    text = '\n'.join(chunk for chunk in chunks if chunk)
    
    print(text)

    Sólo tienes que instalar BeautifulSoup antes :

    pip install beautifulsoup4
    • Cómo si queremos seleccionar algunas de línea, dijo, línea #3?
    • La matanza de los scripts de bits, salvador!!
    • Después de pasar por un montón de stackoverflow respuestas, siento que esta es la mejor opción para mí. Un problema que he encontrado es que las líneas se sumaron en algunos casos. Yo era capaz de superarlo mediante la adición de un separador en get_text función: text = soup.get_text(separator=' ')
    • En lugar de soup.get_text() he utilizado soup.body.get_text(), así que no tengo ningún texto de la <head> elemento, tales como el título.
    • Necesitaba sopa.getText()
    • Cómo extraer el &nbsp;,&lt; símbolos en el contenido
    • Para Python 3, from urllib.request import urlopen

  3. 99

    NOTA: NTLK ya no admite clean_html función

    Respuesta Original a continuación, y una alternativa en las secciones de comentarios.


    Uso NLTK

    He perdido mi 4-5 horas de la reparación de los problemas con html2text. Por suerte pude encontrar NLTK.

    Funciona por arte de magia.

    import nltk   
    from urllib import urlopen
    
    url = "http://news.bbc.co.uk/2/hi/health/2284783.stm"    
    html = urlopen(url).read()    
    raw = nltk.clean_html(html)  
    print(raw)
    • Simplemente elimina el lenguaje de marcado HTML y no el proceso de las etiquetas (como <p> y <br/>) o entidades.
    • a veces eso es suficiente 🙂
    • Quiero votar hasta el presente una y mil veces. Me he quedado atrapado en regex infierno, pero aquí, ahora veo la sabiduría de NLTK.
    • Me alegro de que ayudado 🙂
    • Al parecer, clean_html no es compatible ya: github.com/nltk/nltk/commit/…
    • A mí me funciona.
    • la importación de un pesado de la biblioteca como nltk para tal tarea sencilla sería demasiado
    • De la fuente: raise NotImplementedError ("To remove HTML markup, use BeautifulSoup's get_text() function")
    • Sí bueno llame, me cambié a BeautifulSoup a causa de esto.

  4. 53

    Encontré frente a sólo el mismo problema hoy en día. Me escribió una muy simple analizador de HTML para despojar de contenido entrantes de todas las marcas, devolviendo el resto del texto con sólo un mínimo de formato.

    from HTMLParser import HTMLParser
    from re import sub
    from sys import stderr
    from traceback import print_exc
    
    class _DeHTMLParser(HTMLParser):
        def __init__(self):
            HTMLParser.__init__(self)
            self.__text = []
    
        def handle_data(self, data):
            text = data.strip()
            if len(text) > 0:
                text = sub('[ \t\r\n]+', ' ', text)
                self.__text.append(text + ' ')
    
        def handle_starttag(self, tag, attrs):
            if tag == 'p':
                self.__text.append('\n\n')
            elif tag == 'br':
                self.__text.append('\n')
    
        def handle_startendtag(self, tag, attrs):
            if tag == 'br':
                self.__text.append('\n\n')
    
        def text(self):
            return ''.join(self.__text).strip()
    
    
    def dehtml(text):
        try:
            parser = _DeHTMLParser()
            parser.feed(text)
            parser.close()
            return parser.text()
        except:
            print_exc(file=stderr)
            return text
    
    
    def main():
        text = r'''
            <html>
                <body>
                    <b>Project:</b> DeHTML<br>
                    <b>Description</b>:<br>
                    This small script is intended to allow conversion from HTML markup to 
                    plain text.
                </body>
            </html>
        '''
        print(dehtml(text))
    
    
    if __name__ == '__main__':
        main()
    • Esta parece ser la forma más sencilla de hacer esto en Python (2.7) utilizando sólo los módulos por defecto. El que es tonto de verdad, como esto es un comúnmente cosa necesaria y no hay ninguna razón por qué no hay un analizador de este defecto en la HTMLParser módulo.
    • No creo que convertir html caracteres en unicode, ¿verdad? Por ejemplo, &amp; no se convierte en &, ¿verdad?
    • Para Python 3 uso from html.parser import HTMLParser
  5. 14

    Aquí es una versión de xperroni la respuesta de que es un poco más completa. Se salta el guión y el estilo de las secciones y se traduce charrefs (por ejemplo, &#39;) y entidades HTML (por ejemplo, &amp;).

    También incluye un trivial de texto sin formato html inversa convertidor.

    """
    HTML <-> text conversions.
    """
    from HTMLParser import HTMLParser, HTMLParseError
    from htmlentitydefs import name2codepoint
    import re
    class _HTMLToText(HTMLParser):
    def __init__(self):
    HTMLParser.__init__(self)
    self._buf = []
    self.hide_output = False
    def handle_starttag(self, tag, attrs):
    if tag in ('p', 'br') and not self.hide_output:
    self._buf.append('\n')
    elif tag in ('script', 'style'):
    self.hide_output = True
    def handle_startendtag(self, tag, attrs):
    if tag == 'br':
    self._buf.append('\n')
    def handle_endtag(self, tag):
    if tag == 'p':
    self._buf.append('\n')
    elif tag in ('script', 'style'):
    self.hide_output = False
    def handle_data(self, text):
    if text and not self.hide_output:
    self._buf.append(re.sub(r'\s+', ' ', text))
    def handle_entityref(self, name):
    if name in name2codepoint and not self.hide_output:
    c = unichr(name2codepoint[name])
    self._buf.append(c)
    def handle_charref(self, name):
    if not self.hide_output:
    n = int(name[1:], 16) if name.startswith('x') else int(name)
    self._buf.append(unichr(n))
    def get_text(self):
    return re.sub(r' +', ' ', ''.join(self._buf))
    def html_to_text(html):
    """
    Given a piece of HTML, return the plain text it contains.
    This handles entities and char refs, but not javascript and stylesheets.
    """
    parser = _HTMLToText()
    try:
    parser.feed(html)
    parser.close()
    except HTMLParseError:
    pass
    return parser.get_text()
    def text_to_html(text):
    """
    Convert the given text to html, wrapping what looks like URLs with <a> tags,
    converting newlines to <br> tags and converting confusing chars into html
    entities.
    """
    def f(mo):
    t = mo.group()
    if len(t) == 1:
    return {'&':'&amp;', "'":'&#39;', '"':'&quot;', '<':'&lt;', '>':'&gt;'}.get(t)
    return '<a href="%s">%s</a>' % (t, t)
    return re.sub(r'https?://[^] ()"\';]+|[&\'"<>]', f, text)
    • Gracias; esto funcionó para mí!
    • python 3 versión: gist.github.com/Crazometer/af441bc7dc7353d41390a59f20f07b51
    • Gracias, funcionó a la perfección para mí.
    • En get_text, «.únete debe ser ‘ ‘.unirse. Debe haber un espacio vacío, de lo contrario algunos de los textos que van a unirse.
    • También, esto no va a coger TODOS los textos, excepto que se incluyen otros contenedor de texto de etiquetas como H1, H2,…., span, etc. Tuve que retocarlo para una mejor cobertura.
  6. 9

    Sé que hay un montón de respuestas, pero la mayoría de los elegent y python solución que he encontrado es descrito, en parte, aquí.

    from bs4 import BeautifulSoup
    text = ''.join(BeautifulSoup(some_html_string, "html.parser").findAll(text=True))

    Actualización

    Basado en Fraser comentario, aquí es la solución más elegante:

    from bs4 import BeautifulSoup
    clean_text = ''.join(BeautifulSoup(some_html_string, "html.parser").stripped_strings)
    • Para evitar una advertencia, especifique un analizador para BeautifulSoup a utilizar: text = ''.join(BeautifulSoup(some_html_string, "lxml").findAll(text=True))
    • Usted puede utilizar el stripped_strings generador para evitar el excesivo espacio en blanco – es decir, clean_text = ''.join(BeautifulSoup(some_html_string, "html.parser").stripped_strings
  7. 8

    Puede utilizar html2text método en el stripogram biblioteca también.

    from stripogram import html2text
    text = html2text(your_html_string)

    Para instalar stripogram ejecutar sudo easy_install stripogram

    • Este módulo, de acuerdo a la su pypi página, está en desuso: «a Menos que tengas una razón histórica para el uso de este paquete, te aconsejo en contra de ella!»
  8. 6

    PyParsing hace un gran trabajo. El PyParsing wiki fue asesinado en lo que aquí es otro lugar donde hay ejemplos del uso de PyParsing (ejemplo de enlace). Una de las razones para invertir un poco de tiempo con pyparsing es que él también ha escrito un muy breve, muy bien organizada O’Reilly Corto de Corte manual que es también de bajo costo.

    Habiendo dicho eso, yo uso BeautifulSoup mucho y no es difícil lidiar con las entidades en problemas, usted puede convertir antes de ejecutar BeautifulSoup.

    Goodluck

    • El enlace está muerto o se agrió.
  9. 4

    Esto no es exactamente una solución Python, pero va a convertir el texto en Javascript sería generar en el texto, que creo que es importante (E. G. google.com). El navegador de Enlaces (no Lince) tiene un motor de Javascript, y convertir la fuente de texto con la opción-dump.

    Así que usted podría hacer algo como:

    fname = os.tmpnam()
    fname.write(html_source)
    proc = subprocess.Popen(['links', '-dump', fname], 
    stdout=subprocess.PIPE,
    stderr=open('/dev/null','w'))
    text = proc.stdout.read()
    • algún error en la educación a distancia fname.escribir??
  10. 4

    Lugar de la HTMLParser módulo, echa un vistazo htmllib. Tiene una interfaz similar, pero más de la labor por usted. (Es bastante antigua, por lo que no es de mucha ayuda en términos de deshacerse de javascript y css. Usted podría hacer una clase derivada, pero y añadir métodos con nombres como start_script y end_style (véase el python docs para más detalles), pero es difícil hacerlo de forma confiable para html incorrecto.) De todos modos, aquí hay algo simple que imprime el formato de texto a la consola

    from htmllib import HTMLParser, HTMLParseError
    from formatter import AbstractFormatter, DumbWriter
    p = HTMLParser(AbstractFormatter(DumbWriter()))
    try: p.feed('hello<br>there'); p.close() #calling close is not usually needed, but let's play it safe
    except HTMLParseError: print ':(' #the html is badly malformed (or you found a bug)
    • NB: HTMLError y HTMLParserError debe leer HTMLParseError. Esto funciona, pero hace un mal trabajo de mantenimiento de los saltos de línea.
  11. 4

    si necesitas más velocidad y menos precisión, entonces usted podría usar raw lxml.

    import lxml.html as lh
    from lxml.html.clean import clean_html
    def lxml_to_text(html):
    doc = lh.fromstring(html)
    doc = clean_html(doc)
    return doc.text_content()
  12. 4

    instalar html2text utilizando

    pip install html2text

    entonces,

    >>> import html2text
    >>>
    >>> h = html2text.HTML2Text()
    >>> # Ignore converting links from HTML
    >>> h.ignore_links = True
    >>> print h.handle("<p>Hello, <a href='http://earth.google.com/'>world</a>!")
    Hello, world!
  13. 3

    Hermosa sopa se convierte entidades html. Es probablemente su mejor apuesta teniendo en cuenta que HTML es a menudo buggy y lleno de unicode y la codificación html cuestiones. Este es el código que uso para convertir html a texto sin formato:

    import BeautifulSoup
    def getsoup(data, to_unicode=False):
    data = data.replace("&nbsp;", " ")
    # Fixes for bad markup I've seen in the wild.  Remove if not applicable.
    masssage_bad_comments = [
    (re.compile('<!-([^-])'), lambda match: '<!--' + match.group(1)),
    (re.compile('<!WWWAnswer T[=\w\d\s]*>'), lambda match: '<!--' + match.group(0) + '-->'),
    ]
    myNewMassage = copy.copy(BeautifulSoup.BeautifulSoup.MARKUP_MASSAGE)
    myNewMassage.extend(masssage_bad_comments)
    return BeautifulSoup.BeautifulSoup(data, markupMassage=myNewMassage,
    convertEntities=BeautifulSoup.BeautifulSoup.ALL_ENTITIES 
    if to_unicode else None)
    remove_html = lambda c: getsoup(c, to_unicode=True).getText(separator=u' ') if c else ""
  14. 3

    Otra opción es ejecutar el código html a través de un texto basado en el navegador web y la descarga. Por ejemplo (usando Lynx):

    lynx -dump html_to_convert.html > converted_html.txt

    Esto se puede hacer dentro de una secuencia de comandos de python como sigue:

    import subprocess
    with open('converted_html.txt', 'w') as outputFile:
    subprocess.call(['lynx', '-dump', 'html_to_convert.html'], stdout=testFile)

    No se le dará exactamente el texto desde el archivo HTML, pero dependiendo de su caso de uso puede ser preferible a la salida de html2text.

  15. 2

    Otra que no sea de python solución: Libre Office:

    soffice --headless --invisible --convert-to txt input1.html

    La razón yo prefiero este por encima de otras alternativas es que cada párrafo HTML se convierte en una sola línea de texto (sin saltos de línea), que es lo que yo estaba buscando. Otros métodos requieren de post-procesamiento. Lynx no produce agradable de salida, pero no es exactamente lo que yo estaba buscando. Además, Libre Office puede ser utilizado para convertir todo tipo de formatos…

  16. 2

    Alguien ha intentado bleach.clean(html,tags=[],strip=True) con bleach? se está trabajando para mí.

    • Parece que a mí también, pero no se recomienda su uso para este propósito: «Esta función es un centrado en la seguridad de la función, cuyo único propósito es eliminar el contenido malicioso de una cadena de texto que puede ser visualizada como el contenido en una página web.» -> bleach.readthedocs.io/es/última/limpieza.html#lejía.limpieza
  17. 2

    Sé que hay un montón de respuestas aquí ya, pero creo que newspaper3k también merece una mención. Recientemente he necesarios para completar una tarea similar de extraer el texto de los artículos de la web y de esta biblioteca ha hecho un excelente trabajo en la consecución de este tan lejos en mis pruebas. Ignora el texto se encuentra en los elementos de menú y las barras laterales así como cualquier código JavaScript que aparece en la página como el OP solicitudes.

    from newspaper import Article
    article = Article(url)
    article.download()
    article.parse()
    article.text

    Si ya tienes el código HTML de los archivos descargados, puedes hacer algo como esto:

    article = Article('')
    article.set_html(html)
    article.parse()
    article.text

    Incluso tiene un par de PNL características para resumir los temas de los artículos:

    article.nlp()
    article.summary
  18. 2

    He tenido buenos resultados con Apache Tika. Su finalidad es la extracción de metadatos y textos de contenido, de ahí el analizador subyacente es sintonizado en consecuencia fuera de la caja.

    Tika se puede ejecutar como una servidor, es trivial para ejecutar /implementar en un contenedor Docker, y desde allí se puede acceder a través de Enlaces Python.

  19. 1

    de una manera sencilla

    import re
    html_text = open('html_file.html').read()
    text_filtered = re.sub(r'<(.*?)>', '', html_text)

    este código busca todas las partes de la html_text comenzó con ‘<‘ y termina con ‘>’ y reemplazar todos los encontrados por una cadena vacía

  20. 1

    @PeYoTIL la respuesta usando BeautifulSoup y la eliminación de estilo y de contenido del script no funciona para mí. He probado usando decompose en lugar de extract pero aún no funciona. Así que he creado mi propio que también los formatos de los textos utilizando las <p> etiquetas y reemplaza <a> etiquetas con el href del enlace. También copes con enlaces dentro del texto. Disponible en esta esencia con una prueba doc incrustado.

    from bs4 import BeautifulSoup, NavigableString
    def html_to_text(html):
    "Creates a formatted text email message as a string from a rendered html template (page)"
    soup = BeautifulSoup(html, 'html.parser')
    # Ignore anything in head
    body, text = soup.body, []
    for element in body.descendants:
    # We use type and not isinstance since comments, cdata, etc are subclasses that we don't want
    if type(element) == NavigableString:
    # We use the assumption that other tags can't be inside a script or style
    if element.parent.name in ('script', 'style'):
    continue
    # remove any multiple and leading/trailing whitespace
    string = ' '.join(element.string.split())
    if string:
    if element.parent.name == 'a':
    a_tag = element.parent
    # replace link text with the link
    string = a_tag['href']
    # concatenate with any non-empty immediately previous string
    if (    type(a_tag.previous_sibling) == NavigableString and
    a_tag.previous_sibling.string.strip() ):
    text[-1] = text[-1] + ' ' + string
    continue
    elif element.previous_sibling and element.previous_sibling.name == 'a':
    text[-1] = text[-1] + ' ' + string
    continue
    elif element.parent.name == 'p':
    # Add extra paragraph formatting newline
    string = '\n' + string
    text += [string]
    doc = '\n'.join(text)
    return doc
    • Gracias, esta respuesta es subestimado. Para aquellos de nosotros que quieren tener un texto limpio de la representación que se comporta más como un navegador (ignorando el carácter de nueva línea, y sólo tomando los párrafos y saltos de línea en consideración), BeautifulSoup del get_text simplemente no se corte.
    • me alegro de que encontró útil, gracias también por la contrib. Para cualquier otra persona, la esencia vinculado se ha mejorado bastante. Lo que el OP parece aludir a que es una herramienta que representa el html a texto, como un navegador basado en texto como lynx. Que es lo que esta solución intentos. Lo que la mayoría de las personas están contribuyendo son sólo de texto extractores.
  21. 1

    En Python 3.x puede hacerlo de una manera muy sencilla mediante la importación de ‘imaplib’ y ‘email’ paquetes. Aunque este es un post anterior, pero tal vez mi respuesta puede ayudar a los recién llegados en este post.

    status, data = self.imap.fetch(num, '(RFC822)')
    email_msg = email.message_from_bytes(data[0][1]) 
    #email.message_from_string(data[0][1])
    #If message is multi part we only want the text version of the body, this walks the message and gets the body.
    if email_msg.is_multipart():
    for part in email_msg.walk():       
    if part.get_content_type() == "text/plain":
    body = part.get_payload(decode=True) #to control automatic email-style MIME decoding (e.g., Base64, uuencode, quoted-printable)
    body = body.decode()
    elif part.get_content_type() == "text/html":
    continue

    Ahora usted puede imprimir el cuerpo de la variable y será en formato de texto simple 🙂 Si es lo suficientemente bueno para usted, entonces sería bueno para seleccionarlo como aceptado respuesta.

    • Esto no convertir nada.
    • Esto muestra cómo extraer un text/plain parte de un correo electrónico si alguien puso allí. De no hacer nada para convertir el HTML en texto plano, y no hace nada remotamente útil si usted está tratando de convertir HTML a partir de, digamos, un sitio web.
  22. 1

    Mejor funcionó para mí es inscripts .

    https://github.com/weblyzard/inscriptis

    import urllib.request
    from inscriptis import get_text
    url = "http://www.informationscience.ch"
    html = urllib.request.urlopen(url).read().decode('utf-8')
    text = get_text(html)
    print(text)

    Los resultados son realmente buenos

  23. 1

    se puede extraer solamente el texto de HTML con BeautifulSoup

    url = "https://www.geeksforgeeks.org/extracting-email-addresses-using-regular-expressions-python/"
    con = urlopen(url).read()
    soup = BeautifulSoup(con,'html.parser')
    texts = soup.get_text()
    print(texts)
  24. 1

    Mientras un montón de gente ha mencionado el uso de expresiones regulares para la tira de etiquetas html, hay un montón de inconvenientes.

    por ejemplo:

    <p>hello&nbsp;world</p>I love you

    Debe ser analizado para:

    Hello world
    I love you

    He aquí un fragmento que se me ocurrió, usted puede cusomize a tus necesidades específicas, y funciona como un encanto

    import re
    import html
    def html2text(htm):
    ret = html.unescape(htm)
    ret = ret.translate({
    8209: ord('-'),
    8220: ord('"'),
    8221: ord('"'),
    160: ord(' '),
    })
    ret = re.sub(r"\s", " ", ret, flags = re.MULTILINE)
    ret = re.sub("<br>|<br />|</p>|</div>|</h\d>", "\n", ret, flags = re.IGNORECASE)
    ret = re.sub('<.*?>', ' ', ret, flags=re.DOTALL)
    ret = re.sub(r"  +", " ", ret)
    return ret
  25. 0

    Este es el código que uso en una base regular.

    from bs4 import BeautifulSoup
    import urllib.request
    def processText(webpage):
    # EMPTY LIST TO STORE PROCESSED TEXT
    proc_text = []
    try:
    news_open = urllib.request.urlopen(webpage.group())
    news_soup = BeautifulSoup(news_open, "lxml")
    news_para = news_soup.find_all("p", text = True)
    for item in news_para:
    # SPLIT WORDS, JOIN WORDS TO REMOVE EXTRA SPACES
    para_text = (' ').join((item.text).split())
    # COMBINE LINES/PARAGRAPHS INTO A LIST
    proc_text.append(para_text)
    except urllib.error.HTTPError:
    pass
    return proc_text

    Espero que le ayude.

  26. 0

    El LibreOffice writer comentario tiene mérito ya que la aplicación puede emplear python macros. Se parece ofrecer múltiples beneficios tanto para responder a esta pregunta y a fomentar la macro base de LibreOffice. Si esta resolución es una aplicación, en lugar de ser utilizado como parte de un programa de producción, la apertura de HTML en escritor y guardar la página como texto parece resolver los problemas que se discuten aquí.

  27. 0

    Perl manera (lo siento mamá, nunca voy a hacerlo de la producción).

    import re
    def html2text(html):
    res = re.sub('<.*?>', ' ', html, flags=re.DOTALL | re.MULTILINE)
    res = re.sub('\n+', '\n', res)
    res = re.sub('\r+', '', res)
    res = re.sub('[\t ]+', ' ', res)
    res = re.sub('\t+', '\t', res)
    res = re.sub('(\n )+', '\n ', res)
    return res
    • Esta es una mala práctica para muchos la razón, por ejemplo &nbsp;
    • Sí! Es verdad! No hacerlo anythere!
  28. 0

    Otro ejemplo de uso de BeautifulSoup4 en Python 2.7.9+

    incluye:

    import urllib2
    from bs4 import BeautifulSoup

    Código:

    def read_website_to_text(url):
    page = urllib2.urlopen(url)
    soup = BeautifulSoup(page, 'html.parser')
    for script in soup(["script", "style"]):
    script.extract() 
    text = soup.get_text()
    lines = (line.strip() for line in text.splitlines())
    chunks = (phrase.strip() for line in lines for phrase in line.split("  "))
    text = '\n'.join(chunk for chunk in chunks if chunk)
    return str(text.encode('utf-8'))

    Explicó:

    Leer en la url de los datos como html (usando BeautifulSoup), eliminar todos los elementos script y style, y también obtener el texto usando .get_text(). Entrar en las líneas y quitar espacio delante y detrás de cada uno, luego de romper multi-titulares de una línea cada uno de los trozos = (frase.strip() para la línea líneas de la frase en línea.split(» «)). A continuación, el uso de texto = ‘\n’.únete, colocar las líneas en blanco, finalmente regresar sancionado como utf-8.

    Notas:

  29. -1

    Estoy consiguiendo algo como esto.

    >>> import requests
    >>> url = "http://news.bbc.co.uk/2/hi/health/2284783.stm"
    >>> res = requests.get(url)
    >>> text = res.text
    • Estoy usando python 3.4 y este código funciona muy bien para mí.
    • texto de las etiquetas html en ella

Dejar respuesta

Please enter your comment!
Please enter your name here