Анимация
JavaScript


Главная  Библионтека 

0 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 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 [ 232 ] 233 234 235 236 237 238 239 240 241 242

20.6. Удаление тегов HTML 713

или его сценарный эквивалент: {

local $/; # Временный режим чтения всего файла

Shtml = <FILE>;

Shtml =~ s/<[">].> gs:

Но даже этот вариант работает лишь для самого примитивного HTML-кода, не содержащего никаких «изюминок». В частности, ои пасует перед следующими примерами допустимого HTML-кода (не говоря о многих других):

<IMG SRC = focgif ALT = "A > B">

<!- <Комментарий> ->

<script>if (a<b && a>c)</script>

<# Просто данные #>

<UINCLUDE CDATA [ »»»»»» ]]>

Проблемы возникают и в том случае, если комментарии HTML содержат другие теги:

<!- Раздел закомментирован. <В>Меня не видно!</В>

->

Единственное надежное рещение - использовать алгоритмы анализа HTML-кода из LWP. Эта методика продемонстрирована во втором фрагменте, приведенном в решении.

Чтобы сделать анализ более гибким, субклассируйте HTML::Parser от LWP и записывайте только найденные текстовые элементы:

package MyParser; use HTML::Parser;

use HTML:;Entities qw(decode entities);

©ISA = qw(HTML::Parser);

sub text {

my($self, Stext) = © ;

print decode entities(Stext);

package main;

MyParser->new->parse file(.p);

Если вас интересуют лишь простые теги, ие содержащие вложенных тегов, возможно, вам подойдет другое решение. Следующий пример извлекает название несложного HTML-документа:

(Stitle) = (Shtml m#<TITLE>\s.(. .?)\s.</TITLE>#is);



Приведем пример вывода:

% htitle http www ora com

www.oreilly.com - Welcome to OReilly & Associates!

% htitle http www perl com/ http www perl com/nullvoid http: www.perl.com/: The www.perl.com Home Page http: www.perl.com/nullvoid: 404 File Not Found

> Смотри также-

Документация по модулям HTML::TreeBuilder, HTML::Parser, HTML::Entities и LWP::UserAgent с CPAN; рецепт 20.5.

20.7. Поиск устаревших ссылок

Проблема

Требуется узнать, содержит ли документ устаревшие ссылки.

Решение

Воспользуйтесь методикой, описанной в рецепте 20.3, для получения всех ссылок и проверьте их существование функцией head модуля LWP::Simple.

Комментарий

Следующая программа является прикладным примером методики извлечения ссылок из HTML-документа. На этот раз мы не ограничиваемся простым выво-

Как говорилось выше, подход с регулярными выражениями имеет свои недостатки. В примере 20.4 показано более полное решение, в котором HTML-код обрабатывается с использованием LWP.

Пример 20.4. htitle

#1/usr/bin/perl

# htitle - Получить название HTML-документа для URL

die usage $0 url \n unless ©ARGV, require LWP,

foreach $url (©ARGV) {

$ua = LWP UserAgent->new(),

$res = $ua->request(HTTP Request->new(GET => $url)), print $url If ©ARGV > 1, If ($res->is success) {

print $res->title, \n , } else {

print $res->status line, \n ,



20.8. Поиск свежих ссылок 715

дом ссылок и вызываем для нее функцию head модуля LWP::Simple. Метод HEAD получает метаданные удаленного документа и определяет его статус, не загружая самого документа. Если вызов закончился неудачно, значит, ссылка не работает, и мы выводим соответствующее сообщение.

Поскольку программа использует функцию get из LWP::SimpIe, она должна получать URL, а не имя файла. Если вы хотите поддерживать обе возможности, воспользуйтесь модулем URI;:Heuristic (см. рецепт 20.1).

Пример 20.5. churl

#/usr/bin/perl -w # churl - проверка URL

use HTML LinkExtor,

use LWP Simple qw(get head),

$base url = shift

or die usage $0 <start url>\n , Sparser = HTML LinkExtor->new(undef, $base url). Sparser->parse(get($base url)), ©links = $parser->links, print $base url \n , foreach Slinkarray (©links) { my ©element = ©Slinkarray, my $elt type = shift ©element, while (©element) {

my (Sattr name , $attr value) = splice(©element, 0, 2), if (Sattr value->scheme =" /\b(ftphttpsfile)\b/) {

print Sattr value , head(Sattr value)? OK BAD , \n ,

Для программы действуют те же ограничения, что и для программы, использующей HTML::LinkExtor, из рецепта 20.3.

t> Смотри также-

Документация по модулям HTML::LinkExtor, LWP::Simple, LWP:: User Agent и HTTP::Response с CPAN; рецепт 20.8.

20.8. Поиск свежих ссылок

Проблема

Имеется список URL. Вы хотите узнать, какие из них изменялись позже других.

Решение

Программа из примера 20.6 читает URL из стандартного ввода, упорядочивает их по времени последней модификации и выводит в стандартный вывод с префиксами времени.



0 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 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 [ 232 ] 233 234 235 236 237 238 239 240 241 242