striscia i tag HTML con perl

Qual è il modo più semplice per rimuovere i tag HTML in perl. Sto usando un’espressione regolare per analizzare HTML da un URL che funziona alla grande ma come posso togliere i tag HTML?

Ecco come sto tirando il mio HTML

#!/usr/bin/perl -w use strict; use warnings; use LWP::Simple; my $now_string = localtime; my $html = get("http://www.spc.noaa.gov/climo/reports/last3hours.html") or die "Could not fetch NWS page."; $html =~ s/<script.*?/sg; $html =~ s///sg; $html =~ m{(Hail Reports.*)Wind Reports}s || die; my @hail = $1; 

Un tentativo di rispondere alla tua domanda sbagliata

I problemi


È una ctriggers abitudine entrare nella regexing dell’HTML perché ci sono così tante regole e modi per aggirarle, che potrebbero alla fine aprire il tuo codice alle tecniche di hacking. Mentre potresti avere un legittimo bisogno di qualcosa di semplice ora, è molto facile riusare il codice e dimenticare perché è stata una ctriggers idea riutilizzarlo, specialmente quando non aggiungi commenti come # This code is NOT secure and should not be used to parse HTML anywhere else!!! o # Christina Alguilera writes songs based on this code!!!

Esempio di differenze nell’HTML che richiedono molte regole regex:

 
...

L’elenco continua e questo è solo per HTML ben formato. Alcuni altri esempi di problemi includono:

  1. Elementi HTML chiusi in modo improprio (es.

    ) o non del tutto

  2. Errori di ortografia (es. .. )
  3. HTML progettato con l’intenzione di rompere il tuo script
  4. Altri problemi: commenti, spazi bianchi, set di caratteri, ecc

Soluzione


Potresti aver accettato una risposta, ma dovresti dare un’occhiata a XML :: Parser e HTML :: TreeBuilder .

Piuttosto che estrapolare parti del documento HTML, probabilmente sei più interessato a eseguire il drill down sulla parte del documento che desideri (ad esempio, tutto in o un certo div all’interno di esso), motivo per cui è molto probabile che tu voglia qualcosa che uno dei moduli sopra fornisce. Per non parlare, i parser possono essere utilizzati per fare del loro meglio per rimuovere tutti gli elementi HTML e restituire solo testo / CData.

Come già detto, non usare espressioni regolari per questo. Ci sono semplicemente troppe eccezioni.

Un modulo CPAN che può aiutare è HTML :: Strip :

 use HTML::Strip; my $hs = HTML::Strip->new(); my $clean_text = $hs->parse( $raw_html ); $hs->eof; 

Vale la pena di imparare ciò che è disponibile sul CPAN e farne uso. Ti farà risparmiare molto lavoro a lungo termine.

Dai un’occhiata al modulo HTML :: Restrict che ti consente di rimuovere o limitare i tag HTML consentiti. Un esempio minimo che rimuove tutti i tag HTML:

 use HTML::Restrict; my $hr = HTML::Restrict->new(); my $processed = $hr->process('i am bold'); # returns 'i am bold' 

Consiglierei di stare lontano da HTML :: Strip perché interrompe la codifica utf8 .

c’è anche un bel modulo Perl HTML :: Scrubber.

  #!/usr/bin/perl use warnings; use strict; use HTML::Scrubber; my $file = shift or die "need a file $!\n"; my $html; open (FH,"< $file"); read( FH, $html, -s FH ); close FH; #print "$html\n"; my $scrubber = HTML::Scrubber->new; $scrubber->default(1); ## default to allow HTML #$scrubber->script(0); ## no script #$scrubber->style(0); ## no style # OR $scrubber->deny(qw[script style]); my $clean_html = $scrubber->scrub($html); open (OH, '>', $file.'.scrubbed.html'); print OH $clean_html; close OH; exit; 

Se vuoi solo rimuovere i tag HTML:

 s/ 

Questo (la maggior parte delle volte) rimuoverà tag di script e il loro contenuto e tutti gli altri tag HTML. Probabilmente potresti anche rimuovere tutto prima del tag modo sicuro con regex.

Tuttavia, per le cose più complesse, le espressioni regolari non sono uno strumento adatto e occorre veramente analizzare l’HTML con un parser HTML effettivo e quindi modificarlo per rimuovere i tag.