вырезать HTML-теги с помощью Perl - PullRequest
5 голосов
/ 05 июля 2010

Какой самый простой способ удалить теги HTML в perl.Я использую регулярное выражение для синтаксического анализа HTML-кода с URL-адреса, который прекрасно работает, но как я могу удалить HTML-теги?

Вот как я извлекаю свой 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.*?<\'/script>/sg;
$html =~ s/<.+?>//sg;
$html =~ m{(Hail Reports.*)Wind Reports}s || die;
my @hail = $1;

Ответы [ 5 ]

10 голосов
/ 06 июля 2010

Попытка ответить на ваш ошибочный вопрос


Проблемы


Злоупотреблять регулярным выражением HTML - плохая привычка, потому что существует так много правил и способов их обойти, что в конечном итоге вы можете открыть свой код для взлома. Хотя сейчас у вас может быть законная потребность в чем-то простом, очень легко повторно использовать код и забыть, почему повторное использование было плохой идеей, особенно если вы не добавляете комментарии типа # This code is NOT secure and should not be used to parse HTML anywhere else!!! или # Christina Alguilera writes songs based on this code!!!

Пример различий в HTML, которые требуют большого количества правил регулярных выражений:

<div>...</div>
<div style="blah">
<div style="background:url(../div)">
<div style=".." class='noticesinglequote'>

Список можно продолжить, и это только для правильно сформированного HTML. Некоторые другие примеры проблем:

  1. Элементы HTML закрыты неправильно (например, <div><span></div></span>) или не закрыты совсем
  2. орфографические ошибки (например, <dvi>..</div>)
  3. HTML разработан с намерением сломать ваш скрипт
  4. Другие вопросы: комментарии, пробелы, кодировки и т. Д.

Решение


Возможно, вы приняли ответ, но вам следует взглянуть на XML :: Parser и HTML :: TreeBuilder .

Вместо того, чтобы вырезать части документа HTML, вы, вероятно, больше заинтересованы в детализации той части документа, которую вы хотите (например, всего в <body> или некотором div внутри него), поэтому Скорее всего, вы хотите что-то, что обеспечивает один из вышеуказанных модулей. Не говоря уже о том, что синтаксические анализаторы могут быть использованы для удаления всех элементов HTML и возврата только текста / CData.

7 голосов
/ 06 июля 2010

Как уже упоминалось, не используйте регулярные выражения для этого. Просто слишком много исключений.

Один модуль CPAN, который может помочь: HTML :: Strip :

use HTML::Strip;

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

Стоит узнать, что доступно на CPAN, и использовать его. Это сэкономит вам много работы в долгосрочной перспективе.

5 голосов
/ 03 марта 2011

Взгляните на модуль HTML :: Restrict , который позволяет убирать или ограничивать допустимые теги HTML. Минимальный пример, который удаляет все теги HTML:

use HTML::Restrict;

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

Я бы рекомендовал держаться подальше от HTML :: Strip, потому что нарушает кодировку utf8 .

0 голосов
/ 22 апреля 2017

есть также хороший 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;
0 голосов
/ 05 июля 2010

Если вы просто хотите удалить теги HTML:

s/<script.*?<\/script>//sg
s/<.+?>//sg

Это (в большинстве случаев) удалит теги сценария и их содержимое, а также все другие теги HTML.Вы также можете, вероятно, удалить все до тега <body> с помощью регулярных выражений.

Для чего-либо более сложного, чем это, хотя регулярные выражения не подходящий инструменти вам действительно нужно проанализировать HTML с фактическим анализатором HTML, а затем манипулировать этим, чтобы удалить теги.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...