2012-05-25 8 views
1

У меня есть файл html, хранящийся на диске (файл This). Я хочу удалить все html-теги изображений. Это то, что я пробовал до сих пор.Удаление определенных html-тегов в perl

#!/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("", <READ>); 
close READ; 

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

Если я просто запустить эту программу, она печатает

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. 

Файл хранится, но он не имеет метки изображения удалены (линия 9, где я применить фильтр). Что я делаю неправильно здесь.

+0

Ошибка говорит все: '{'all'}' имеет нечетное число элементов и, следовательно, не является допустимым хэшем. Замените его '' all'', '{'all' => 'somevalue'}' или '['all']' в зависимости от того, должен ли он быть скаляром, хэшем или массивом. – flesk

+0

И добавьте 'use strict;' в ваш скрипт. Вы выиграете от этого в долгосрочной перспективе. – flesk

+0

Да. Это работает. Но показ объявлений по-прежнему отображается. Любая идея, как удалить их. Также как бы я просто получил контент на этой странице? – user1092042

ответ

2

Прежде всего вы должны всегдаuse strict и use warnings в начале вашей программы, особенно, прежде чем просить о помощи, чтобы исправить это.

Вы создали две HTML::TagFilter объекты: $tf, который не имеет фильтров и $self, который удаляет <img> элементы. Вы использовали $tf для обработки HTML, чтобы ваши данные не изменились.

Этот код работает с исправлениями, которые я упомянул, и несколькими другими.

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); 
+0

Он использует предупреждения, как это указано в предупреждениях, включенных в вопрос. Я соглашусь с тем, что использование «предупреждений» лучше, чем флаг 'w', для чего-либо другого, кроме оболочки с одним слоем. – flesk

+0

@flesk: а ваша точка? – Borodin

+0

Просто потому, что это было похоже на то, что вы подразумевали, что его нет, и использование «предупреждений» дает результат, с которым он просит помощи (даже если это не его единственная проблема). – flesk

Смежные вопросы