����� Guido Socher (homepage)
�� ������:
Guido �������� Perl �� ��� ���� � ��������. ����� Perl
"���� ����� ������ ������� ������� ���" - ��������� ��������
����������� ���, ��� ���������� �������� ����������������
����������� ������������.
������� �� �������:
Pukhlyakov Kirill <kirill(at)linuxfocus.org>
����������:
|
��������� HTML ���� �� Perl, HTML::TagReader
������:
���� ��� ���� ���������� �������, �� ���� ��� ������ �������� �����
�� ������������� ���������� ��, �� ���� � ������ ������-����
����������� ��� ����������.
����������� ���������� �������� � ������� ��������� ��� �����������.
� ��������� ������ �� ����� �������� ������ � SGML/XML/HTML ������.
��� ����� �������� �� �����. ������, � ������� ������ ����
� ���� �������, ������������ ����� �� �����.
�������, ��� �� ������� � Perl ���������� ������. � ����� ������
������� ��������� �� ��� ���������� ������� �� ����
����� (������ 2000).
_________________ _________________ _________________
����������
������ ����� ����� ��������� ��������� - �������� ����������������
����� Unix - /etc/hosts, /etc/passwd ... ���� ���� ������ ��,
� ������� �� ������ ����� ������� ��� ����������� ������/������ ������.
������������ ��� SGML/XML/HTML ����� �������� �� �����, ������ �� �����
�������� �������� � ���, �� ��������� ��������� � ���� �� ��� ���
������������� �� ������.
�������� ������� HTML �����, ������������ �������� ����� ����� �������
����� ����� � ��� �� ����� ������� �� ����� ��������� �������� �����
������������ ��� "Tidy". �� ���������� ��������� ���������, �������� ��
��, ��� HTML ������� �� �����. �� ������ �������� ��� � �-����� -
������������ ����� ������ ��������� � ���� ������, �� ��� ����� �� ������ -
��� ����� ����������.
�� � ������ ������� ����� ���������� ��� �������� HTML ���� ������ ���
��������� �� ������ �� ������ ������� �����, �� �� ����� - �� ��������
�� ������ ������� ����� ��������� ��� "������ ����� ���� 4123". ��� ������,
��� ��� ��������� �������� ����� �������� �� �������� ���� ������.
��������� ������������ ��� �� ���, ������� ������������ HTML ���� ���
�� ����� � ��� ���� ���������� ��� ������ �����.
��������� �������
������ ��� ������ ����� � Perl ���������� ��������
while(<FILEHANDLE>). � ���������� ���� ����� ��������
��������� � ��������� ������ ����� �������� � ���������� $_.
������ ��� ������ Perl? ���� � ���, ��� � Perl ���� ��������� ����������
INPUT_RECORD_SEPARATOR ($RS ��� $/), � ������� ������������ ������ "\n"
��� ����� ������. ���� �� ���������� $/=">", �� Perl ����� �������
">" ������ ������. ��������� ������������ Perl ������ �����������
html ����� ����� �������, ��� ������ ������ ����� ������������� �� ">":
perl -ne 'sub BEGIN{$/=">";} s/\s+/ /g; print
"$_\n";' file.html
����� html ����
<html><p>some text here</p></html>
������������� � ������ ����
<html>
<p>
some text here</p>
</html>
�� ��� ��-�������� �� ����� �������. ��� ������������ �����, �����
������ ������������ ��� �� �����. �����, ��������, ����� ���� �����
����� "<a href= ..." ���� ���� "a" � "href" ����������� �� ������
�������.
������ ���������� "$/" (INPUT_RECORD_SEPARATOR) �� �������� ������
����������. ����� ����� ��������������� ����������� ����������� -
��� ������� ������� � ����� �������� � ���������� ����������, �� ����
������ ������ ������������.
� ��� ��������?? � ��������� ������� ��������� ���-�� ���
HTML::TagReader, �� � ������-�� �� ��� ��� ������ � �����-�� ������
�������� ��� ����������� �������������� �������. ��������� ��� ���
����� ���������� ��������:
- ����� �������, ��� ����� ��� HTML ����� � ���� �����������.
���� ���������� ����� ������ � ��������� �� "�", ������� ��������
�� HTML ������ ���
if ( limit > 3) ....
������
if ( limit > 3) ....
� HTML ����������� ��� ������ ���� "<", � ����������� ">".
�� ���� �� ��� �� ������ ���������� ��� ���� � ������. ����
������ �������� ��������� �� ���������, �� ������ �� ����� ��
��������.
- ������ "$/" ������� ��������� �� ���� ���������. � ���� ��
��������� ����� ����, �� ��������� ��������.
��� ��� ������ �����, ��� ������ � ��������� ������� ����� ������������
���������� "$/" (INPUT_RECORD_SEPARATOR).
� ���� ���� ���� ����������, ������� ���������� ��, ��� �� ��� ���
����� ���������. � ��� �������� "$/" �� "<". �������� �� ��� ������
����������� ������������ "<", ��� ">", ������� ������� ������
������������ ������� � "<", ��� � ">".
��������� ���������� tr_tagcontentgrep
( ���������� ), �� ������ �� ���� ���������� ��� ���������� �����
������. ��� ��������� ����� ���� ������������ ��� "grep'�" ������
( �������� "img" ) � ���� ���� ���� ��� ���������� �� ������ �������,
��������:
tr_tagcontentgrep -l img file.html
index.html:53: <IMG src="../images/transpix.gif" alt="">
index.html:257: <IMG SRC="../Logo.gif" width=128
height=53>
HTML::TagReader
HTML::TagReader ������ �������� � ������� INPUT_RECORD_SEPARATOR, �
����� ���������� ����� �������� ������ ��������� ������ �� �����.
�� �� ��� ����������� ��� HTML::Parser � ���������� ������ ��, ���
���� ��� ��������� html ���� - ����������� ������ ��� �� �����.
���������� ����������. ��������� ��� ������������ ������ � ��������
�����. ������� ��������� ���:
use HTML::TagReader;
�����:
my $p=new HTML::TagReader "filename";
����� ������� ���� � �������� ��������� ������ �� ���� � $p. ������
��������� $p->gettag(0) ��� $p->getbytoken(0) �������� ������
� ���������� ����. gettag ���������� ������ �������� �����, �.�. ��,
��� ��������� ����� < � >, � getbytoken ����� ���������� �����,
������� ������������ ����� ������ � �������� ���, ��� ��� - ����� ���
���. ��������� ��� ������� ����� ����� ������������ html �����, ��� �������
� ���������� ��� ��������� ������� ������. ������ �������� ����������
�� ������ ����� ����� (man ��������
HTML::TagReader.
�������� �������� ������ ������������� ������ - ������� ���������
���������� ���������� ����������:
#!/usr/bin/perl -w
use strict;
use HTML::TagReader;
#
die "USAGE: htmltitle file.html [file2.html...]\n" unless($ARGV[0]);
my $printnow=0;
my ($tagOrText,$tagtype,$linenumber,$column);
#
for my $file (@ARGV){
my $p=new HTML::TagReader "$file";
# read the file with getbytoken:
while(($tagOrText,$tagtype,$linenumber,$column) = $p->getbytoken(0)){
if ($tagtype eq "title"){
$printnow=1;
print "${file}:${linenumber}:${column}: ";
next;
}
next unless($printnow);
if ($tagtype eq "/title" || $tagtype eq "/head" ){
$printnow=0;
print "\n";
next;
}
$tagOrText=~s/\s+/ /; #kill newline, double space and tabs
print $tagOrText;
}
}
# vim: set sw=4 ts=4 si et:
��� ��� ��������? ����� html ���� ��� �� ����� ��� ������
$p->getbytoken(0) �� ���� <title> ��� <Title>
��� <TITLE> ( $tagtype eq "title" ) � ����� �������
������������� ���� ( $printnow ) � �������� �������� ��������� ����
�� �������� </title>.
���������� ��������� ����� ���������:
htmltitle file.html somedir/index.html
file.html:4: the cool perl page
somedir/index.html:9: joe's homepage
������� ����� ������������ � tr_tagcontentgrep ������ �
HTML::TagReader. ����� ��������� ������� ������ � �����:
#!/usr/bin/perl -w
use HTML::TagReader;
die "USAGE: taggrep.pl searchexpr file.html\n" unless ($ARGV[1]);
my $expression = shift;
my @tag;
for my $file (@ARGV){
my $p=new HTML::TagReader "$file";
while(@tag = $p->gettag(0)){
# $tag[0] is the tag (e.g <a href=...>)
# $tag[1]=linenumber $tag[2]=column
if ($tag[0]=~/$expression/io){
print "$file:$tag[1]:$tag[2]: $tag[0]\n";
}
}
}
������ ��������� ���������� ��������, ��� ������� ��������� ������,
�� �� ��������� ������������. ����� ����� ���� � ���������� ������
"gif" ���������� ��� ��������� �������:
taggrep.pl gif file.html
file.html:135:15: <img src="images/2doc.gif" width=34
height=22>
file.html:140:1: <img src="images/tst.gif" height="164"
width="173">
������ ��� ������? ������� ���������, ������� ������� ��� ����
<font...> � </font> �� html �����. ��� ���� ( font )
������������ � �������� ���������� ��������������� ������������
��� ������� html ���� � ����� ��������� �������� ��� ���������
����� ������ ����������. ��� ���������� ������ ��������� - ���
������� ��� ���� font, �� �� ������ ������� ����������������� ��
� ������� ������ ��������� fontface ��� size, � color ���������.
#!/usr/bin/perl -w
use strict;
use HTML::TagReader;
# strip all font tags from html code but leave the rest of the
# code un-changed.
die "USAGE: delfont file.html > newfile.html\n" unless ($ARGV[0]);
my $file = $ARGV[0];
my ($tagOrText,$tagtype,$linenumber,$column);
#
my $p=new HTML::TagReader "$file";
# read the file with getbytoken:
while(($tagOrText,$tagtype,$linenumber,$column) = $p->getbytoken(0)){
if ($tagtype eq "font" || $tagtype eq "/font"){
print STDERR "${file}:${linenumber}:${column}: deleting $tagtype\n";
next;
}
print $tagOrText;
}
# vim: set sw=4 ts=4 si et:
��� ������ ���������� ����� �������� �������� ��������� ����� �
��������� �����.
� ������ � ����������� HTML::TagReader ( ��. ������ ) ���������
��������� �������� ������������� ������.
- tr_blck -- ����� ������������ ������������� ������ � HTML ���������
- tr_llnk -- ����� ������ ������ � HTML ������
- tr_xlnk -- ������ ������ �� �������� �������� �� index �����
- tr_mvlnk -- ������ ����� � HTML ������ ��������� perl.
- tr_staticssi -- ������ SSI �������� #include virtual �
#exec cmd �� ����������� html ��������.
- tr_imgaddsize -- ���������� width=... � height=... � ��� <img
src=...>
tr_xlnk � tr_staticssi ������� ��� ����������� ���-����� �� CD. ��� ������
������ ��� �������� http://www.linuxfocus.org/index.html ���� ���� �� ������
�������� http://www.linuxfocus.org/ ( ��� index.html ). ���� � ������ �����������
����� �� ���� �� ������ ���������� ��� ����� � ����� ����������� �
����� �������� ( file:/mnt/cdrom ) �� �� ������� ������ ������ ������
�������� ������ index.html. ��� ��������� � ������ ��� ��� ��������
LinuxFocus CD - �������� ����������� ����� ��� � ������� � ������������
������ ����� ����� ��������. ������ ��� ���������� tr_xlnk � ��� ��.
������, ��� HTML::TagReader ����� ������� ��� ���. ��������
����������������!
������
�������� �������
� ������ ������� ���� �������� �������. �� ���� �������� �� ������ ��������
���� ����������� ��� ����������� ����������� ������ ��������� :
2003-01-03, generated by lfparser version 2.31