Perl & LWP часть 1

| Нет комментариев | Нет трекбэков

Решил перевести одну интересную главу из книги Perl&LWP, буду выкладывать ее тут по мере перевода.

Глава 7. Обработка HTML посимвольно (with Token)

Contents:

HTML как Токены
Основы использования HTML::TokeParser
Индивидуальные токены (символы)
Последовательности токенов
Больше методов HTML::TokeParser

Регулярные выражения безусловно очень мощная штука, но они предлагают нам крайне низкий уровень работы с HTML. Вы вынуждены волноваться о пробелах и переводе строк, одинарных и двойных кавычках, HTML комментариях, и много еще о чем. В этой главе мы будем использовать модуль HTML:: TokeParser, чтобы извлечь информацию из файлов HTML. Используя эти методы, Вы можете извлечь информацию из любого файла HTML, и никогда больше не беспокоиться о спецификации той или иной разметки HTML (или стиля web-программиста).

Perl & LWP

Глава 7. Обработка HTML посимвольно (with Token)

Contents:

HTML как Токены
Основы использования HTML::TokeParser

Индивидуальные токены (символы)
Последовательности токенов
Больше методов HTML::TokeParser

Регулярные выражения безусловно очень мощная штука, но они предлагают нам крайне низкий уровень работы с HTML. Вы вынуждены волноваться о пробелах и переводе строк, одинарных и двойных кавычках, HTML комментариях, и много еще о чем. В этой главе мы будем использовать модуль HTML:: TokeParser, чтобы извлечь информацию из файлов HTML. Используя эти методы, Вы можете извлечь информацию из любого файла HTML, и никогда больше не беспокоиться о спецификации той или иной разметки HTML (или стиля web-программиста).

7.1. HTML как Токены*

Ваш опыт работы с HTML вероятно позволит вам понять исходный код, наподобие этого:

<p>Dear Diary,

<br>I'm gonna be a superstar, because I'm learning to play

the <a href="http://MyBalalaika.com">balalaika</a> &amp; the <a

href='http://MyBazouki.com'>bazouki</a>!!!

Модуль HTML:: TokeParser делит HTML код на единицы, называемые символами (токенами).

* Токен - это единица парсинга.

Вот как вышеупомянутый исходный код разбивается на токены:

start-tag token

p with no attributes

text token

Dear Diary,\n

start-tag token

br with no attributes

text token

I'm gonna be a superstar, because I'm learning to play\nthe

start-tag token

a, with attribute href whose value is http://MyBalalaika.com

text token

balalaika

end-tag token

a

text token

&amp; the , which means & the

start-tag token

a, with attribute href equals http://MyBazouki.com

text token

bazouki

end-tag token

a

text token

!!!\n

Это представление кода более абстрактно, сосредоточено на понятиях разметки HTML, а не на отдельных символах. К примеру, у двух тегов <a> есть различные типы кавычек в сыром HTML (или вообще без кавычек), но такие атрибуты как <a, с признаком href, есть у всех. Программа, которая извлекает информацию, работая с потоком символов, не должна беспокоиться об особенностях кодирования записей, пробелов, кавычек или пытаться угадать, где закрываются тэги.

7.2 Основы использования HTML::TokeParser

Модуль HTML:: TokeParser является классом для доступа к HTML как к символам. Объект HTML:: TokeParser  позволяет обрабатывать HTML код так, как будто вы работаете с обыкновенным файлом, при этом оперируете лишь такими понятиями как строки, не вдаваясь в разбор конкретных словосочетаний данной строки. Может слишком заумно сказано, но примеры кода развеют туман.

Создайте объект используя один из способов:

my $stream = HTML::TokeParser->new($filename)

  || die "Couldn't read HTML file $filename: $!";

или:

my $stream = HTML::TokeParser->new( \$string_of_html );

После того как вы создали объект,вы можете получить следующий токен вызвав:

my $token = $stream->get_token( );

Теперь переменная $token хранит ссылку на массив, или undef значение, если весь входной html прочитан. Этот пример кода обрабатывает каждый токен в документе:

my $stream = HTML::TokeParser->new($filename)

  || die "Couldn't read HTML file $filename: $!";

 

while(my $token = $stream->get_token) {

  # ... consider $token ...

}

$token может принимать одно из шести значений, различающихся по первому значению $token->[0], как показано в  Таблице 7-1.

Таблица 7-1. Типы токенов

Token

Values

Start-tag

["S",  $tag, $attribute_hashref, $attribute_order_arrayref, $source]

End-tag

["E",  $tag, $source]

Text

["T",  $text, $should_not_decode]

Comment

["C",  $source]

Declaration

["D",  $source]

Processing instruction

["PI", $content, $source]

7.2.1. Start-Tag токены

Если значение $token->[0] eq "S", токен представляет собой начальный тэг:

["S",  $tag, $attribute_hash, $attribute_order_arrayref, $source]

Компоненты этого токена:

$tag

Тэг - имя тэга в нижнем регистре.

$attribute_hashref

Ссылка на хэш атрибутов тэга. Названия атрибута = ключи хэша (пример: rel => 'nofollow').

$attribute_order_arrayref

Ссылка на массив названий атрибутов, если вам нужен доступ к ним в определенном порядке.

$source

Оригинальный HTML код данного токена.

В большинстве случаев, представляют интерес первые три значения.

 К примеру, анализ такого HTML кода:

<IMG SRC="kirk.jpg" alt="Shatner in r&ocirc;le of Kirk" WIDTH=352 height=522>

Даст нам следующий токен:

[

  'S',# $token->[0]

  'img',# $tag

# $attribute_hashref

  { 'alt' => 'Shatner in r?le of Kirk',

     'height' => '522', 'src' => 'kirk.jpg', 'width' => '352'

  },

# $attribute_order_arrayref

  [ 'src', 'alt', 'width', 'height' ],

# $source

  '<IMG SRC="kirk.jpg" alt="Shatner in r&ocirc;le of Kirk" WIDTH=352 height=522>'

]

Заметьте, что тэги и имена атрибутов хранятся в нижнем регистре (SRC -> src), а кодированный символ &ocirc - был декодирован!

7.2.2. End-Tag токены

Когда $token->[0] принимает значение "E", токен представляет собой конечный тэг:

[ "E", $tag, $source ]

Компоненты этого токена следующие:

$tag

Тэг - имя тэга закрывающегося в нижнем регистре.

$source

Оригинальный HTML код данного токена.

Анализ такого HTML:

</A>

Даст нам токен:

[ 'E', 'a', '</A>' ]

7.2.3. Текстовые токены

Когда $token->[0] равен"T", то он представляет из себя текст:

["T", $text, $should_not_decode]

Элементы данного массива:

$text

Текст, который возможно имеет запись.

$should_not_decode

Булево значение, которое указывает декодировать данный текст или нет.

Анализируя данный HTML:

&amp; the

Получим токен:

[ 'T',

  ' &amp; the',

  ''

]

Пустая строка рассматривается как false, и указывает нам на то чтобы декодировать значение в $text

Текст внутри тэгов <script>, <style>, <xmp>, <listing>, и <plaintext> не предполагает декодирование. Именно для такого текста $should_not_decode принимает значение true.

Продолжение следует... 

 

Нет трекбэков

URL для трекбэков: http://perlmonks.org.ru/cgi-bin/MT/engine/mt-tb.cgi/7

Комментировать

Об этой записи

Сообщение опубликовано 30.03.2009 17:25. Автор — Monks.

Предыдущая запись — Как работать с WebMoney из Perl?

Следующая запись — Приложение для создание GUI на perl

Смотрите новые записи на главной странице или загляните в архив, где есть ссылки на все сообщения.

Страницы


 


 

Page copy protected against web site content infringement by Copyscape