Решил перевести одну интересную главу из книги 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-программиста).
Ваш опыт работы с 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> & the <a
href='http://MyBazouki.com'>bazouki</a>!!!
Модуль HTML:: TokeParser делит HTML код на единицы, называемые символами (токенами).
* Токен - это единица парсинга.
Вот как вышеупомянутый исходный код разбивается на токены:
start-tag token
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
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ô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ôle of Kirk" WIDTH=352 height=522>'
]
Заметьте, что тэги и имена атрибутов хранятся в нижнем регистре (SRC -> src), а кодированный символ ô - был декодирован!
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:
& the
Получим токен:
[ 'T',
' & the',
''
]
Пустая строка рассматривается как false, и указывает нам на то чтобы декодировать значение в $text
Текст внутри тэгов <script>, <style>, <xmp>, <listing>, и <plaintext> не предполагает декодирование. Именно для такого текста $should_not_decode принимает значение true.
Продолжение следует...



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