[LinuxFocus-icon]
�����  |  �����  |  ������  |  �����

������� | ������ | ������ | ��� LF
��� �������� �������� �� ��������� ������: English  Castellano  Deutsch  Francais  Italiano  Nederlands  Portugues  Russian  Turkce  

[Photo of the Author]
����� Guido Socher (homepage)

�� ������:

Guido �������� Perl �� ��� ���� � ��������. ����� Perl "���� ����� ������ ������� ������� ���" - ��������� �������� ����������� ���, ��� ���������� �������� ���������������� ����������� ������������.



������� �� �������:
Pukhlyakov Kirill <kirill(at)linuxfocus.org>

����������:

 

��������� HTML ���� �� Perl, HTML::TagReader

[Illustration]

������:

���� ��� ���� ���������� �������, �� ���� ��� ������ �������� ����� �� ������������� ���������� ��, �� ���� � ������ ������-���� ����������� ��� ����������.
����������� ���������� �������� � ������� ��������� ��� �����������. � ��������� ������ �� ����� �������� ������ � 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, �� � ������-�� �� ��� ��� ������ � �����-�� ������ �������� ��� ����������� �������������� �������. ��������� ��� ��� ����� ���������� ��������: ��� ��� ������ �����, ��� ������ � ��������� ������� ����� ������������ ���������� "$/" (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_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 ����� ������� ��� ���. �������� ����������������!  

������

 

�������� �������

� ������ ������� ���� �������� �������. �� ���� �������� �� ������ �������� ���� ����������� ��� ����������� ����������� ������ ��������� :
 talkback page 

Webpages maintained by the LinuxFocus Editor team
© Guido Socher, FDL
LinuxFocus.org
Translation information:
en --> -- : Guido Socher (homepage)
en --> ru: Pukhlyakov Kirill <kirill(at)linuxfocus.org>

2003-01-03, generated by lfparser version 2.31