Eliminarea anumitor etichete html în perl

Am un fișier html stocat pe disc (fișierul este Acest ). Vreau să elimin toate etichetele html ale imaginilor. Așa am încercat până acum.

#!/usr/bin/perl -w
use HTML::TagFilter;
my $tf = new HTML::TagFilter;

open READ, "D:\\Scripts\\file.html" or die "Couldn't open file: $!"; 
$string1 = join("", ); 
close READ;

my $self = HTML::TagFilter->new(deny => {img => {'all'}});
open (MYFILE, '>D:\\Scripts\\remove.html');
print MYFILE $tf->filter($string1);
close (MYFILE); 

Dacă am rula doar acest program se imprimă

Odd number of elements in anonymous hash at remove everything else.pl line 9.
Parsing of undecoded UTF-8 will give garbage when decoding entities at C:/Perl64
/site/lib/HTML/TagFilter.pm line 499.

Fișierul este stocat, dar nu are eliminat etichetele de imagine (linia 9 este locul în care aplică filtrul). Ce fac greșit aici.

1
Da. Asta merge. Dar anunțurile sunt încă afișate. Ai idee cum să le elimini. De asemenea, cum aș obține conținutul pe acea pagină
adăugat autor user1092042, sursa
Eroarea spune totul: {'all'} are un număr impar de elemente și, prin urmare, nu este un hash valid. Înlocuiți-l cu 'all' , {'all' => 'somevalue'} sau [all] . fi scalar, hash sau matrice.
adăugat autor flesk, sursa
Și adăugați folosiți stricte; în scriptul dvs. Veți beneficia de aceasta pe termen lung.
adăugat autor flesk, sursa

1 răspunsuri

Mai întâi, trebuie să întotdeauna utilizați instrucțiunile stricte și use warnings la începutul programului, în special înainte de a cere ajutor pentru remedierea acestora.

Ați creat două obiecte HTML :: TagFilter : $ tf care nu au filtre și $ self cod> elemente. Ați folosit $ tf pentru a procesa codul HTML, astfel încât datele dvs. să rămână neschimbate.

Acest cod funcționează, cu corecțiile pe care le-am menționat și cu alte câteva.

use strict;
use warnings;

use HTML::TagFilter;

my $tf = HTML::TagFilter->new(deny => {img => {all => []}});

my $html = do {
  open my $fh, 'D:\Scripts\file.html' or die "Couldn't open file: $!";
  local $/;
  <$fh>;
};

open my $out, '>', 'D:\Scripts\remove.html' or die "Unable to open output file: $!";
print $out $tf->filter($html);
2
adăugat
Asta funcționează, dar aveți o idee despre cum să eliminați anunțurile deoarece unele imagini sunt încă păstrate.
adăugat autor user1092042, sursa
Deci, nu există nici o modalitate de a le elimina este acolo.
adăugat autor user1092042, sursa
El folosește avertismente, așa cum sugerează avertismentele incluse în întrebare. Sunt de acord că use warnings este o practică mai bună decât pavilionul w pentru orice altceva decât un shell one-liner.
adăugat autor flesk, sursa
Doar că ar părea că ați sugerat că nu a fost, și este folosirea avertizărilor care generează ieșirea cu care solicită ajutor (chiar dacă nu este singura problemă).
adăugat autor flesk, sursa
@ flesk: și punctul dvs. este ceea ce?
adăugat autor Borodin, sursa
OK, îmi pare rău dacă nu era clar. Sunt uimit că atât de mulți oameni folosesc în continuare - când este aproape irelevant pentru orice altceva decât sistemele Unix
adăugat autor Borodin, sursa
Unele dintre anunțuri sunt imagini de fundal, cum ar fi html # type-toyota-article-structured.template-toyota-articol corp un div # brandscape . De aceea nu poți să le elimini cu asta. Există și câteva elemente flash pe care le cred.
adăugat autor simbabque, sursa