Форум программистов, компьютерный форум, киберфорум
Perl
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.56/64: Рейтинг темы: голосов - 64, средняя оценка - 4.56
курлык-курлык
 Аватар для Max Patsy
87 / 96 / 8
Регистрация: 26.11.2009
Сообщений: 396
Записей в блоге: 1

Парсинг HTML HTML::Parser

10.07.2011, 13:40. Показов 12632. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Хочу предложить перевод статьи Ken MacFarlane. Надеюсь у новичков после прочтения, отпадёт много вопросос по этой теме . http://www.foo.be/docs/tpj/iss... -0003.html

Перл часто используется для работы с HTML страницами - составляющими веб сайтов. Например для задаиа удаления тегов и извлечения текста из HTML страницы. В решении этой задачи обычно используются регулярные выражения, которые часто очень сложные, которые часто в процессе программирования становятся неполными или неправильными. Альтернативное решение - использовать библиотеку HTML::Parser (http://www.perl.com/CPAN).

Эта библиотека сканирует входные строчки HTML кода и разбивает их на сегменты. К примеру строка

HTML5
1
<A HREF="index.html">This is a link</A>
будет разбита на три сегмента:
  1. начальный тег (<A HREF="index.html">)
  2. текст (This is a link)
  3. конечный тег (</A>)

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

Первый пример парсера.
Процедуры переопределены и пример служит для простого вывода кода HTML файла.

Perl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
       #!/usr/bin/perl -w
       
       use strict;
       
       package IdentityParse;
       use base "HTML::Parser";
       
       sub text {
          my ($self, $text) = @_;
          # просто выводим оригинальный текст
          print $text;
      }
      
      sub comment {
          my ($self, $comment) = @_;
          # выводим коментарии
          print $comment; 
      }
      
      sub start {
          my ($self, $tag, $attr, $attrseq, $origtext) = @_;
          # вывод текста вместе с тегами
          print $origtext;
      }
      
      sub end {
          my ($self, $tag, $origtext) = @_;
          print $origtext;
      }
      
      my $p = new IdentityParse;
      $p->parse_file("index.html");
Мы переопределяем процедуры text(), comment(), start(), end() для того что бы они выдавали исходный текст HTML страницы.



The HTML Tag Stripper

Следующий пример удаляет все теги и выводит только текст.
Perl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
           #!/usr/bin/perl -w       
       use strict;
       
       package HTMLStrip;
       use base "HTML::Parser";
       
       sub text 
       {
          my ($self, $text) = @_;
          print $text;
       }
      
       my $p = new HTMLStrip;
       # обработка осуществляется строка за строкой, можно вводить теги в командной строке, но мне всё же больше нравится первый пример, где работа с файлом
       while (<>) 
       {
          $p->parse($_);
       }
       $p->eof;
Так как нам интересен только текст, то мы переопределяем процедуру text(). Так же в строках 13-17 мы используем метод parse() вместо parse_file(). Это даёт нам возможность работать с командной строкой. При использовании метода parse() мы должны вызывать метод eof() (19 строка), он осуществляет проверку и очищает внутренний буфер HTML::Parser.


ту би континьюд...
2
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
10.07.2011, 13:40
Ответы с готовыми решениями:

Как отослать HTML с помощю Perl-a, так чтобы когда откроется почта, там была страница HTML-a?
Подскажите как отослать HTML с помощю Perl-a, так чтобы когда откроется почта, там была страница HTML-a.

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

Отслеживание структуры HTML
Данн HTML документ с заведомо неправильной структурой.Нужно написать программу которая бы отследила структуру HTML документа,и если есть...

2
курлык-курлык
 Аватар для Max Patsy
87 / 96 / 8
Регистрация: 26.11.2009
Сообщений: 396
Записей в блоге: 1
12.07.2011, 08:09  [ТС]
Третий пример.
Сейчас мы разберём тег META.
HTML5
1
<META NAME="DESCRIPTION" CONTENT="description of file">
Perl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
   #!/usr/bin/perl -w
   
   use strict;
   
   package GetSummary;
   use base "HTML::Parser";
   
   my $meta_contents;
   my $h1 =    "";
   my $title = "";
  
  # set state flags
   my $h1_flag    = 0;
   my $title_flag = 0;
  
   sub start {
       my ($self, $tag, $attr, $attrseq, $origtext) = @_;
   
      if ($tag =~ /^meta$/i &&  
        $attr->{'name'} =~ /^description$/i) {
           # set if we find <META NAME="DESCRIPTION"
           $meta_contents = $attr->{'content'};
       } elsif ($tag =~ /^h1$/i && ! $h1) {
           # set state if we find <H1> or <TITLE>
           $h1_flag = 1;
       } elsif ($tag =~ /^title$/i && ! $title) {
           $title_flag = 1;
       }
   }
   
   sub text {
       my ($self, $text) = @_;
       # If we're in <H1>...</H1> or    <TITLE>...</TITLE>, save text    
       if ($h1_flag)    { $h1    .= $text; } 
       if ($title_flag) { $title .= $text; }
   }
   
   sub end {
       my ($self, $tag, $origtext) = @_;
   
       # reset appropriate flag if we see </H1> or </TITLE>
       if ($tag =~ /^h1$/i)    { $h1_flag = 0; }
       if ($tag =~ /^title$/i) { $h1_flag = 0; } 
   }
   
   my $p = new GetSummary;
   while (<>) {
       $p->parse($_);
  }
   $p->eof;
  
   print "Summary information: ", $meta_contents || 
       $h1 || $title || "No summary information found.", "\n";
В строках 19-27 переменная $Attr содержит ссылку на хеш, где атрибуты тега отображаются в виде пар ключ/значение.

Линии 19-21 проверяют, если текущий тег META и атрибут NAME имеет значение DESCRIPTION; если да, то переменной $meta_contents присваиваем значение атрибута CONTENT. Линии 22-27 проверяют H1 или заголовок. Из этих тегов мы вытаскиваем только текст.

Когда текст процедур вызывается, они не знают какие теги есть, а каких нет. Поэтому для обнаружения парных тегов мы использовали флаги, которые мы устанавливаем в 1, когда мы нашли начальный тег(start()), и в 0 когда нашли конечный тег(end()). В процедуре text() если флаги взведены, мы вытаскиваем только текст.
0
 Аватар для sunjan
12 / 7 / 7
Регистрация: 02.04.2014
Сообщений: 342
29.07.2015, 12:59
Классная статья)полезная,спасибо)ТОлько в силу слабого знания перла не вся понятная)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
29.07.2015, 12:59
Помогаю со студенческими работами здесь

Поиск ссылок в HTML
Здравствуйте! У меня в переменной есть строковое представление HTML. Подскажите, какой регуляркой получить все ссылки из этой переменной.

Скрипт для HTML
В общем, дали задание &quot;Сделать скрипт на Perl для динамического HTML&quot; Основная идея скрипта - чтобы пользователь ввел число (радиус) и...

HTML + CSS + Perl
Всем добрый вечер! Изучаю perl, конкретно для web программирования, нахожусь пока на начальной стадии этого джедайского пути. ...

сайт на html/perl
Народ, есть где-нибудь готовый сайт с меню желательно? очень нужно рассмотреть принцип записи функций меню. Поделитесь пожалуйста, если...

Выборка строк с HTML-страницы
Друзья, всем доброго времени суток. С регулярками у меня всегда были сложности. В своём скрипте делаю GET запрос, ответ от которого...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
PowerShell Snippets
iNNOKENTIY21 11.11.2025
Модуль PowerShell 5. 1+ : Snippets. psm1 У меня модуль расположен в пользовательской папке модулей, по умолчанию: \Documents\WindowsPowerShell\Modules\Snippets\ А в самом низу файла-профиля. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru