Estrazione di testo da file HTML tramite Python


243

Vorrei estrarre il testo da un file HTML usando Python. Voglio essenzialmente lo stesso output che otterrei se copiassi il testo da un browser e lo incollassi nel blocco note.

Vorrei qualcosa di più robusto dell'utilizzo di espressioni regolari che potrebbero non riuscire su HTML scarsamente formato. Ho visto molte persone raccomandare Beautiful Soup, ma ho avuto qualche problema nell'usarlo. Per uno, ha raccolto testo indesiderato, come fonte JavaScript. Inoltre, non ha interpretato le entità HTML. Ad esempio, mi aspetto che & # 39; nel sorgente HTML da convertire in apostrofo nel testo, proprio come se avessi incollato il contenuto del browser in Blocco note.

L'aggiornamento html2text sembra promettente. Gestisce correttamente le entità HTML e ignora JavaScript. Tuttavia, non produce esattamente testo normale; produce markdown che dovrebbero quindi essere convertiti in testo semplice. Viene fornito senza esempi o documentazione, ma il codice sembra pulito.


Domande correlate:


Per un po 'di tempo, le persone sembrano trovare la mia risposta NLTK (abbastanza recente) estremamente utile, quindi potresti prendere in considerazione l'idea di cambiare la risposta accettata. Grazie!
Shatu,

1
Non avrei mai pensato di imbattermi in una domanda posta dall'autore del mio blog preferito! The Endeavour!
Ryan G,

1
@Shatu Ora che la tua soluzione non è più valida, potresti voler eliminare il tuo commento. Grazie! ;)
Sнаđошƒаӽ,

Risposte:


136

html2text è un programma Python che fa un ottimo lavoro in questo.


5
bit è gpl 3.0 il che significa che potrebbe essere incompatibile
frog32

138
Sorprendente! l'autore è RIP Aaron Swartz.
Atul Arvind,

2
Qualcuno ha trovato alternative a html2text a causa di GPL 3.0?
jontsai,

1
GPL non è così male come la gente vuole che sia. Aaron lo sapeva meglio.
Steve K,

2
Ho provato sia html2text che nltk ma non hanno funzionato per me. Ho finito per andare con Beautiful Soup 4, che funziona magnificamente (nessun gioco di parole previsto).
Ryan,

150

Il miglior pezzo di codice che ho trovato per estrarre il testo senza ottenere javascript o cose non volute:

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)

Devi solo installare BeautifulSoup prima:

pip install beautifulsoup4

2
Come se volessimo selezionare qualche riga, appena detta, riga # 3?
hepidad,

3
Gli script per uccidere, salvatore !!
Nanda,

2
Dopo aver esaminato molte risposte di StackOverflow, penso che questa sia l'opzione migliore per me. Un problema che ho riscontrato è che le linee sono state sommate in alcuni casi. Sono stato in grado di superarlo aggiungendo un separatore nella funzione get_text:text = soup.get_text(separator=' ')
Joswin KJ

5
Invece di soup.get_text()usarlo soup.body.get_text(), in modo da non ottenere alcun testo dall'elemento <head>, come il titolo.
Sjoerd,

10
Per Python 3,from urllib.request import urlopen
Jacob Kalakal Joseph,

99

NOTA: NTLK non supporta più la clean_htmlfunzione

Risposta originale di seguito e un'alternativa nelle sezioni dei commenti.


Usa NLTK

Ho perso le mie 4-5 ore a risolvere i problemi con html2text. Fortunatamente ho potuto incontrare NLTK.
Funziona magicamente.

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)

8
a volte basta :)
Sharmila,

8
Voglio votare questo mille volte. Ero bloccato nell'inferno regex, ma ecco, ora vedo la saggezza di NLTK.
BenDundee,

26
Apparentemente, clean_html non è più supportato: github.com/nltk/nltk/commit/…
alexanderlukanin13

5
importare una libreria pesante come nltk per un compito così semplice sarebbe troppo
richie

54
@ alexanderlukanin13 Dalla fonte:raise NotImplementedError ("To remove HTML markup, use BeautifulSoup's get_text() function")
Chris Arena,

54

Mi sono trovato ad affrontare lo stesso problema oggi. Ho scritto un parser HTML molto semplice per eliminare il contenuto in arrivo di tutti i markup, restituendo il testo rimanente con solo un minimo di formattazione.

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()

5
Questo sembra essere il modo più semplice per farlo in Python (2.7) usando solo i moduli predefiniti. Il che è davvero sciocco, poiché questa è una cosa così comunemente necessaria e non c'è una buona ragione per cui non c'è un parser per questo nel modulo HTMLParser predefinito.
Ingmar Hupp,

2
Non credo che convertirà i caratteri HTML in Unicode, giusto? Ad esempio, &amp;non verrà convertito in &, giusto?
speedplane il

Per Python 3 usarefrom html.parser import HTMLParser
sebhaase

14

Ecco una versione della risposta di xperroni che è un po 'più completa. Salta le sezioni di script e stile e traduce charrefs (ad es. & # 39;) ed entità HTML (ad es. & Amp;).

Include anche un banale convertitore inverso da semplice testo a HTML.

"""
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)


In get_text, '' .join dovrebbe essere '' .join. Dovrebbe esserci uno spazio vuoto, altrimenti alcuni dei testi si uniranno.
Obinna Nnenanya,

1
Inoltre, questo non catturerà TUTTI i testi, tranne che includi altri tag del contenitore di testo come H1, H2 ...., span, ecc. Ho dovuto modificarlo per una migliore copertura.
Obinna Nnenanya,

11

So che ci sono un sacco di risposte già, ma il più elegent e divinatorio soluzione che ho trovato è descritto, in parte, qui .

from bs4 import BeautifulSoup

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

Aggiornare

Sulla base del commento di Fraser, ecco una soluzione più elegante:

from bs4 import BeautifulSoup

clean_text = ''.join(BeautifulSoup(some_html_string, "html.parser").stripped_strings)

2
Per evitare un avviso, specifica un parser che BeautifulSoup possa usare:text = ''.join(BeautifulSoup(some_html_string, "lxml").findAll(text=True))
Floyd

È possibile utilizzare il generatore stripped_strings per evitare un'eccessiva white-space - cioèclean_text = ''.join(BeautifulSoup(some_html_string, "html.parser").stripped_strings
Fraser

8

Puoi usare il metodo html2text anche nella libreria stripogram.

from stripogram import html2text
text = html2text(your_html_string)

Per installare lo stripogramma, eseguire sudo easy_install stripogram


23
Questo modulo, secondo la sua pagina pypi , è deprecato: "A meno che tu non abbia qualche motivo storico per usare questo pacchetto, lo sconsiglio!"
intuito il

7

C'è una libreria di modelli per il data mining.

http://www.clips.ua.ac.be/pages/pattern-web

Puoi anche decidere quali tag conservare:

s = URL('http://www.clips.ua.ac.be').download()
s = plaintext(s, keep={'h1':[], 'h2':[], 'strong':[], 'a':['href']})
print s

6

PyParsing fa un ottimo lavoro. Il wiki di PyParsing è stato ucciso, quindi ecco un'altra posizione in cui ci sono esempi dell'uso di PyParsing ( esempio di collegamento ). Uno dei motivi per investire un po 'di tempo con il pyparsing è che ha anche scritto un breve manuale O'Reilly Short Cut molto ben organizzato che è anche economico.

Detto questo, uso BeautifulSoup molto e non è difficile gestire i problemi delle entità, puoi convertirli prima di eseguire BeautifulSoup.

In bocca al lupo


1
Il link è morto o inacidito.
Yvette,

4

Questa non è esattamente una soluzione Python, ma convertirà il testo che Javascript genererebbe in testo, che penso sia importante (ad es. Google.com). Il browser Links (non Lynx) ha un motore Javascript e convertirà l'origine in testo con l'opzione -dump.

Quindi potresti fare qualcosa del tipo:

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()

4

Invece del modulo HTMLParser, controlla htmllib. Ha un'interfaccia simile, ma fa più lavoro per te. (È piuttosto antico, quindi non è di grande aiuto in termini di eliminazione di javascript e css. Potresti creare una classe derivata, ma e aggiungere metodi con nomi come start_script e end_style (vedi i documenti di Python per i dettagli), ma è difficile per farlo in modo affidabile per HTML non valido.) Comunque, ecco qualcosa di semplice che stampa il testo normale sulla console

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 e HTMLParserError devono entrambi leggere HTMLParseError. Funziona, ma fa un cattivo lavoro nel mantenere le interruzioni di linea.
Dave Knight,

4

Consiglio un pacchetto Python chiamato goose-extractor Goose proverà ad estrarre le seguenti informazioni:

Testo principale di un articolo Immagine principale dell'articolo Qualsiasi film Youtube / Vimeo incorporato nell'articolo Meta Description Meta tags

Altro: https://pypi.python.org/pypi/goose-extractor/


4

se hai bisogno di più velocità e meno precisione, allora puoi usare lxml grezzo.

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()

4

installa html2text usando

pip installa html2text

poi,

>>> 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!

4

So che ci sono già molte risposte qui, ma penso che anche il giornale3k meriti una menzione. Di recente ho dovuto completare un compito simile per estrarre il testo dagli articoli sul Web e questa libreria ha svolto un ottimo lavoro nel raggiungere questo obiettivo finora nei miei test. Ignora il testo trovato nelle voci di menu e nelle barre laterali nonché qualsiasi JavaScript che appare sulla pagina come richiesto dall'OP.

from newspaper import Article

article = Article(url)
article.download()
article.parse()
article.text

Se hai già scaricato i file HTML, puoi fare qualcosa del genere:

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

Ha anche alcune funzionalità di PNL per riassumere gli argomenti degli articoli:

article.nlp()
article.summary

3

La bella zuppa converte le entità html. È probabilmente la tua scommessa migliore considerando che l'HTML è spesso difettoso e pieno di problemi di codifica Unicode e HTML. Questo è il codice che uso per convertire HTML in testo non elaborato:

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 ""

3

Un'altra opzione è quella di eseguire l'html attraverso un browser Web basato su testo e scaricarlo. Ad esempio (utilizzando Lynx):

lynx -dump html_to_convert.html > converted_html.txt

Questo può essere fatto all'interno di uno script Python come segue:

import subprocess

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

Non ti darà esattamente solo il testo del file HTML, ma a seconda del tuo caso d'uso potrebbe essere preferibile all'output di html2text.


3

Per me è meglio lavorare con gli script.

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)

I risultati sono davvero buoni


2

Un'altra soluzione non python: Libre Office:

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

Il motivo per cui preferisco questo ad altre alternative è che ogni paragrafo HTML viene convertito in una singola riga di testo (senza interruzioni di riga), che è quello che stavo cercando. Altri metodi richiedono la post-elaborazione. Lynx produce un output piacevole, ma non esattamente quello che stavo cercando. Inoltre, Libre Office può essere utilizzato per convertire da tutti i tipi di formati ...


2

Qualcuno ha provato bleach.clean(html,tags=[],strip=True)con la candeggina ? sta funzionando per me.


Sembra funzionare anche per me, ma non raccomandano di usarlo per questo scopo: "Questa funzione è una funzione incentrata sulla sicurezza il cui unico scopo è rimuovere il contenuto dannoso da una stringa in modo che possa essere visualizzato come contenuto in un web pagina." -> bleach.readthedocs.io/en/latest/clean.html#bleach.clean
Loktopus

2

Ho avuto buoni risultati con Apache Tika . Il suo scopo è l'estrazione di metadati e testo dal contenuto, quindi il parser sottostante è sintonizzato di conseguenza fuori dalla scatola.

Tika può essere eseguito come server , è banale da eseguire / distribuire in un contenitore Docker e da lì è possibile accedere tramite i collegamenti Python .


1

in modo semplice

import re

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

questo codice trova tutte le parti del testo html iniziate con '<' e termina con '>' e sostituisce tutte le parti trovate da una stringa vuota


1

La risposta di @ PeYoTIL usando BeautifulSoup ed eliminando lo stile e il contenuto dello script non ha funzionato per me. L'ho provato usando decomposeinvece di extractma ancora non ha funzionato. Così ho creato il mio che formatta anche il testo usando i <p>tag e sostituisce i <a>tag con il collegamento href. Gestisce anche i collegamenti all'interno del testo. Disponibile a questo punto con un documento di prova incorporato.

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

1
Grazie, questa risposta è sottovalutata. Per quelli di noi che vogliono avere una rappresentazione di testo chiara che si comporta più come un browser (ignorando le nuove righe e prendendo in considerazione solo i paragrafi e le interruzioni di riga), BeautifulSoup get_textsemplicemente non lo taglia.
jrial

@jrial felice che l'abbia trovato utile, grazie anche per il contributo. Per chiunque altro, l'essenziale collegato è stato migliorato un po '. Ciò a cui l'OP sembra alludere è uno strumento che rende html in testo, proprio come un browser basato su testo come lynx. Questo è ciò che tenta questa soluzione. Ciò che la maggior parte delle persone sta contribuendo sono solo estrattori di testo.
racitup,

1

In Python 3.x puoi farlo in un modo molto semplice importando i pacchetti 'imaplib' e 'email'. Anche se questo è un post più vecchio, ma forse la mia risposta può aiutare i nuovi arrivati ​​in questo 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

Ora puoi stampare la variabile del corpo e sarà in formato testo normale :) Se è abbastanza buono per te, sarebbe bello selezionarlo come risposta accettata.


Questo non converte nulla.
Antti Haapala,

1
Questo ti mostra come estrarre una text/plainparte da un'e-mail se qualcun altro ne inserisce una lì. Non fa nulla per convertire l'HTML in testo normale e non fa nulla di remotamente utile se stai cercando di convertire l'HTML da, per esempio, un sito web.
triplo il

1

puoi estrarre solo testo dall'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)

1

Mentre molte persone hanno menzionato l'uso di regex per eliminare i tag html, ci sono molti aspetti negativi.

per esempio:

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

Dovrebbe essere analizzato a:

Hello world
I love you

Ecco uno snippet che ho ideato, puoi personalizzarlo in base alle tue esigenze specifiche e funziona come un incantesimo

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

1

Un altro esempio che utilizza BeautifulSoup4 in Python 2.7.9+

comprende:

import urllib2
from bs4 import BeautifulSoup

Codice:

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'))

Ha spiegato:

Leggi i dati dell'URL come html (usando BeautifulSoup), rimuovi tutti gli elementi di script e di stile e ottieni anche solo il testo usando .get_text (). Rompi in linee e rimuovi lo spazio iniziale e finale su ciascuno, quindi spezza i titoli multipli in una linea ciascuno dei blocchi = (frase.strip () per la linea in linee per la frase in line.split ("")). Quindi usando text = '\ n'.join, elimina le righe vuote, infine ritorna come sanzionato utf-8.

Appunti:

  • Alcuni sistemi su cui viene eseguito falliranno con https: // connessioni a causa del problema SSL, è possibile disattivare la verifica per risolvere il problema. Correzione di esempio: http://blog.pengyifan.com/how-to-fix-python-ssl-certificate_verify_failed/

  • Python <2.7.9 potrebbe avere qualche problema con questo

  • text.encode ('utf-8') può lasciare strane codifiche, potrebbe invece voler semplicemente restituire str (testo).


0

Ecco il codice che uso regolarmente.

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

Spero che aiuti.


0

Il commento dello scrittore di LibreOffice ha valore poiché l'applicazione può utilizzare macro Python. Sembra offrire molteplici vantaggi sia per rispondere a questa domanda sia per migliorare la base macro di LibreOffice. Se questa risoluzione è un'implementazione unica, piuttosto che essere utilizzata come parte di un programma di produzione più ampio, l'apertura dell'HTML in scrittura e il salvataggio della pagina come testo sembrano risolvere i problemi discussi qui.


0

Perlway (scusa mamma, non lo farò mai in produzione).

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

Questa è una cattiva pratica per così tante ragioni, per esempio&nbsp;
Uri Goren il

Sì! È vero! Non farlo qui!
brunql
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.