Что самый легкий путь состоит в том, чтобы разделить HTML-тэги в жемчуге. Я использую регулярное выражение для парсинга 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;
Это плохая привычка - увлекаться regex'ом в HTML, потому что существует очень много правил и способов их обойти, что в конечном итоге может открыть ваш код для взлома. Хотя сейчас у вас может быть законная необходимость в чем-то простом, очень легко повторно использовать код и забыть, почему его использование было плохой идеей, особенно если не добавлять комментарии типа # Этот код НЕ безопасен и не должен использоваться для разбора HTML где-либо еще!!!
или # Кристина Альгилера пишет песни на основе этого кода!!!
<div>...</div>
<div style="blah">
<div style="background:url(../div)">
<div style=".." class='noticesinglequote'>
Список можно продолжить, и это только для хорошо сформированного HTML. Некоторые другие примеры проблем включают:
) или вообще не закрыты....
Возможно, вы уже приняли ответ, но вам стоит посмотреть на XML::Parser и HTML::TreeBuilder.
Вместо того чтобы вырезать части HTML-документа, вы, вероятно, больше заинтересованы в том, чтобы дойти до нужной вам части документа (например, все в или определенный
div
внутри него), вот почему вам, скорее всего, нужно что-то, что предоставляет один из вышеперечисленных модулей. Не говоря уже о том, что парсеры могут быть использованы для удаления всех элементов HTML и возврата только текста/CData.
Как уже говорилось, не используйте для этого регулярные выражения. Просто существует слишком много исключений.
Одним из модулей CPAN, который может помочь, является HTML::Strip:
use HTML::Strip;
my $hs = HTML::Strip->new();
my $clean_text = $hs->parse( $raw_html );
$hs->eof;
Стоит узнать, что есть в CPAN, и воспользоваться этим. Это сэкономит вам много работы в долгосрочной перспективе.
Если вы просто хотите удалить теги HTML:
s/<script.*?<\/script>//sg
s/<.+?>//sg
Это приведет (в большинстве случаев) к удалению тегов сценариев и их содержимого, а также всех других тегов HTML. Вы также, вероятно, могли бы безопасно удалить все до тега
с помощью регулярного выражения.
Однако для чего-либо более сложного, чем это, регулярные выражения не подходящий инструмент, и вам действительно нужно проанализировать HTML с помощью реального анализатора HTML, а затем манипулировать им, чтобы удалить теги.