разделите HTML-ТЭГИ с жемчугом

Что самый легкий путь состоит в том, чтобы разделить 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;
5
задан shinjuo 5 July 2010 в 03:47
поделиться

3 ответа

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


Проблемы


Это плохая привычка - увлекаться regex'ом в HTML, потому что существует очень много правил и способов их обойти, что в конечном итоге может открыть ваш код для взлома. Хотя сейчас у вас может быть законная необходимость в чем-то простом, очень легко повторно использовать код и забыть, почему его использование было плохой идеей, особенно если не добавлять комментарии типа # Этот код НЕ безопасен и не должен использоваться для разбора HTML где-либо еще!!! или # Кристина Альгилера пишет песни на основе этого кода!!!

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

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

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

  1. HTML-элементы закрыты неправильно (например,
    ) или вообще не закрыты
  2. Орфографические ошибки (например, ....
)
  • HTML, созданный с намерением сломать ваш скрипт
  • Другие проблемы: комментарии, пробелы, charsets, etc
  • Решение


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

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

    10
    ответ дан 18 December 2019 в 07:28
    поделиться

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

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

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

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

    7
    ответ дан 18 December 2019 в 07:28
    поделиться

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

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

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

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

    -1
    ответ дан 18 December 2019 в 07:28
    поделиться
    Другие вопросы по тегам:

    Похожие вопросы: