{"id":163567,"date":"2012-12-22T00:20:03","date_gmt":"2012-12-21T20:20:03","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=163567"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=163567","title":{"rendered":"<span class=\"post_title\">HTML::TokeParser<\/span>"},"content":{"rendered":"<div class=\"content html_format\">   \t\u041e\u0434\u043d\u0438\u043c \u0438\u0437 \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u0447\u0430\u0441\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0445 \u043c\u043d\u043e\u044e \u043c\u043e\u0434\u0443\u043b\u0435\u043c \u043f\u0440\u0438 \u043f\u0430\u0440\u0441\u0438\u043d\u0433\u0435 HTML \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f HTML::TokeParser. \u042d\u0442\u043e\u0442 \u043c\u043e\u0434\u0443\u043b\u044c \u0440\u0430\u0437\u0431\u0438\u0432\u0430\u0435\u0442 \u0432\u0435\u0441\u044c HTML \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442 \u043d\u0430 \u0442\u043e\u043a\u0435\u043d\u044b, \u0441 \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u043f\u043e\u0437\u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u0443\u0434\u043e\u0431\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c.<\/p>\n<p>  \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043a\u0430\u043a\u043e\u0439-\u043b\u0438\u0431\u043e \u043f\u0440\u0438\u043c\u0435\u0440 \u043d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435. \u0412\u043e\u0437\u044c\u043c\u0435\u043c \u0441\u0430\u0439\u0442 <a href=\"http:\/\/habrahabr.ru\/\">habrahabr.ru\/<\/a> <a name=\"habracut\"><\/a><\/p>\n<p>  <b>\u041f\u0440\u0438\u043c\u0435\u0440 1.<\/b> \u041d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0441\u043f\u0430\u0440\u0441\u0438\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u0441\u0441\u044b\u043b\u043e\u043a \u043d\u0430 \u043f\u043e\u043b\u043d\u044b\u0435 \u0441\u0442\u0430\u0442\u044c\u0438.<\/p>\n<p>  <b>\u041f\u0435\u0440\u0432\u043e\u0435.<\/b> \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0443\u044e \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u043a\u0443. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0442\u0435\u0433 meta, \u0434\u043b\u044f \u0445\u0430\u0431\u0440\u0430 \u044d\u0442\u043e \u2013 UTF-8<\/p>\n<pre><code class=\"html\">&lt;meta http-equiv=&quot;content-type&quot; content=&quot;text\/html; charset=utf-8&quot; \/&gt; <\/code><\/pre>\n<p>  <b>\u0412\u0442\u043e\u0440\u043e\u0435.<\/b> \u0421\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u0432\u0435\u0431 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443 \u0432 \u0444\u0430\u0439\u043b. \u041f\u0438\u0448\u0435\u043c \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0441\u043a\u0440\u0438\u043f\u0442<\/p>\n<pre><code class=\"perl\">use strict; use warnings; use HTML::TokeParser; use Data::Dumper;  open (my $f,&quot;&lt;&quot;, $ARGV[0]) ; my $p = HTML::TokeParser-&gt;new($f);  while (my $token = $p-&gt;get_token())  { \tprint Dumper ($token);\t } <\/code><\/pre>\n<p>  \u041f\u0435\u0440\u0435\u0434\u0430\u0435\u043c \u0435\u043c\u0443 \u043d\u0430 \u0432\u0445\u043e\u0434 \u043d\u0430\u0448 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u043d\u044b\u0439 \u0444\u0430\u0439\u043b \u0438 \u043f\u0435\u0440\u0435\u043d\u0430\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 STDOUT \u0432 \u0444\u0430\u0439\u043b. \u041c\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0447\u0442\u043e-\u0442\u043e \u043d\u0430 \u043f\u043e\u0434\u043e\u0431\u0438\u0438<\/p>\n<pre><code class=\"perl\">$VAR1 = [           'T',           ' ',           ''         ]; $VAR1 = [           'D',           '&lt;!DOCTYPE html&gt;'         ]; $VAR1 = [           'T',           '     ',           ''         ]; $VAR1 = [           'S',           'html',           {             'xmlns' =&gt; 'http:\/\/www.w3.org\/1999\/xhtml',             'xml:lang' =&gt; 'ru'           },           [             'xmlns',             'xml:lang'           ],           '&lt;html xmlns=&quot;http:\/\/www.w3.org\/1999\/xhtml&quot; xml:lang=&quot;ru&quot;&gt;'         ]; <\/code><\/pre>\n<p>  \u0438 \u0442.\u0434. \u042d\u0442\u043e\u0442 \u0444\u0430\u0439\u043b \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0434\u043b\u044f \u043e\u0442\u043b\u0430\u0434\u043a\u0438. <\/p>\n<p>  <b>\u0422\u0440\u0435\u0442\u044c\u0435.<\/b> \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c Firebug \u0438 \u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u0447\u0442\u043e \u0438\u0437 \u0441\u0435\u0431\u044f \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043f\u043e\u043b\u043d\u0443\u044e \u0432\u0435\u0440\u0441\u0438\u044e \u0441\u0442\u0430\u0442\u044c\u0438. \u0412\u043e\u0442 \u0447\u0442\u043e \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0432 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435<\/p>\n<pre><code class=\"html\">&lt;a href=&quot;http:\/\/habrahabr.ru\/post\/163525\/#habracut&quot; class=&quot;button habracut&quot;&gt;\u0427\u0438\u0442\u0430\u0442\u044c \u0434\u0430\u043b\u044c\u0448\u0435 \u2192&lt;\/a&gt; <\/code><\/pre>\n<p>  \u0414\u043e\u0433\u0430\u0434\u044b\u0432\u0430\u0435\u043c\u0441\u044f, \u0447\u0442\u043e \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043b\u0435\u0433\u043a\u043e \u043d\u0430\u0439\u0442\u0438 \u0432\u0441\u0435 \u0441\u0441\u044b\u043b\u043a\u0438 \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f class=\u00abbutton habracut\u00bb. \u0418\u0449\u0435\u043c \u0432 \u0444\u0430\u0439\u043b\u0438\u043a\u0435, \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u043e\u043c \u043d\u0430 \u0448\u0430\u0433\u0435 2 \u0441\u0442\u0440\u043e\u043a\u0443 <b>button habracut<\/b>. \u041f\u0438\u0448\u0435\u043c \u0441\u0432\u043e\u0439 \u043f\u0430\u0440\u0441\u0435\u0440, \u044f \u043e\u0431\u044b\u0447\u043d\u043e \u043e\u0444\u043e\u0440\u043c\u043b\u044f\u044e \u0435\u0433\u043e \u0432 \u0432\u0438\u0434\u0435 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430. \u041f\u0430\u0440\u0441\u0435\u0440 \u0434\u043e\u043b\u0436\u0435\u043d \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 HTML. \u0412\u043e\u0442 \u0447\u0442\u043e \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c<\/p>\n<p>  Test.pl  <\/p>\n<pre><code class=\"perl\">use strict; use warnings; use habr_parse; use LWP::UserAgent; use Data::Dumper;  my $ua = LWP::UserAgent-&gt;new();  my $res = $ua-&gt;get(&quot;http:\/\/habrahabr.ru&quot;);  if ($res-&gt;is_success()) { \tmy $parser = habr_parse-&gt;new();  #\tprint Dumper ($res);  \tmy $conf = {}; \t$conf-&gt;{content} = $res-&gt;content;\t \t$conf-&gt;{cp} = 'utf8'; \tmy $r = $parser-&gt;get_page_links($conf);\t \t \tprint Dumper ($r); }  <\/code><\/pre>\n<p>  Habr_parse.pm<\/p>\n<pre><code class=\"perl\">package habr_parse; use strict; use warnings; use HTML::TokeParser; use HTML::Entities; use Data::Dumper; use Encode;  sub new { \tmy $class = shift;  \tmy $self = {};  \tbless ($self, $class);  }  sub get_page_links { \tmy $self = shift; \tmy $conf = shift;  \tmy @data; \t# get internal format \t$conf-&gt;{content} = decode($conf-&gt;{cp},$conf-&gt;{content}); #\tprint Dumper ($conf); \tdecode_entities($conf-&gt;{content});  \tmy $p = HTML::TokeParser-&gt;new(\\$conf-&gt;{content});  \twhile (my $token = $p-&gt;get_token()) \t{ \t\t# we found our link \t\tif ($token-&gt;[0] eq 'S' && $token-&gt;[1] eq 'a' && defined ($token-&gt;[2]-&gt;{class}) && $token-&gt;[2]-&gt;{class}=~\/^\\s*button\\s+habracut$\/i) \t\t{ \t\t\tpush @data, $token-&gt;[2]-&gt;{href};\t\t\t \t\t} \t} #\tprint Dumper ($p);\t \t \treturn \\@data; }     return 1; <\/code><\/pre>\n<p>  \u0414\u043b\u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0441\u0442\u0440\u043e\u043a\u0438 \u043a\u043e\u0434\u0430 \u043d\u0438\u0436\u0435, \u043e\u0447\u0435\u043d\u044c \u043f\u043e\u043c\u043e\u0433\u0430\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0444\u0430\u0439\u043b\u0430, \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u043d\u0430 \u0448\u0430\u0433\u0435 2 (\u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0435\u0441\u043b\u0438 \u0443\u0441\u043b\u043e\u0432\u0438\u0439 \u043c\u043d\u043e\u0433\u043e)  <\/p>\n<pre><code class=\"perl\">\tif ($token-&gt;[0] eq 'S' && $token-&gt;[1] eq 'a' && defined ($token-&gt;[2]-&gt;{class}) && $token-&gt;[2]-&gt;{class}=~\/^\\s*button\\s+habracut$\/i)  <\/code><\/pre>\n<p>  \u0412 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0435 \u044d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043a\u0430\u0436\u0434\u0430\u044f \u0441\u0441\u044b\u043b\u043a\u0430 \u0438\u043c\u0435\u0435\u0442 <b>\u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u0430\u0442\u0440\u0438\u0431\u0443\u0442 (\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 class)<\/b>, \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043d\u0435\u0442 \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0438\u0433\u0434\u0435. \u041d\u043e \u0441\u0438\u043b\u0430 HTML::TokeParser \u043d\u0435 \u0432 \u044d\u0442\u043e\u043c. \u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043f\u0440\u0438\u043c\u0435\u0440 2.<\/p>\n<p>  <b>\u041f\u0440\u0438\u043c\u0435\u0440 2. \u041d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u0442 \u0441\u043f\u0438\u0441\u043e\u043a \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0439.<\/b> \u0421 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Firebug \u043c\u044b \u0437\u0430\u043c\u0435\u0447\u0430\u0435\u043c, \u0447\u0442\u043e \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438 \u043d\u0430\u0445\u043e\u0434\u044f\u0442\u0441\u044f \u0432\u043d\u0443\u0442\u0440\u0438 \u0442\u0435\u0433\u0430 div \u0441 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u043e\u043c class=\u2019hubs\u2019. <\/p>\n<p>  \u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043c\u044b \u0437\u0430\u0445\u043e\u0434\u0438\u043c \u043d\u0430 \u0441\u0430\u0439\u0442 \u0431\u0435\u0437 \u043a\u0443\u043a\u043e\u0432 \u0438 \u043a\u0430\u043a\u043e\u0439-\u043b\u0438\u0431\u043e \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u0442\u043e \u043c\u044b \u043d\u0435 \u043c\u043e\u0436\u0435\u043c \u0431\u044b\u0442\u044c \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043d\u044b \u043d\u0438 \u043d\u0430 \u043e\u0434\u0438\u043d \u0445\u0430\u0431, \u043f\u043e\u044d\u0442\u043e\u043c \u0434\u043b\u044f \u043d\u0430\u0441 \u0432\u044b\u0432\u043e\u0434\u044f\u0442\u0441\u044f \u0441\u0441\u044b\u043b\u043a\u0438 \u0441 title = \u2018\u0412\u044b \u043d\u0435 \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043d\u044b \u043d\u0430 \u044d\u0442\u043e\u0442 \u0445\u0430\u0431\u2019<\/p>\n<p>  \u0415\u0441\u043b\u0438 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043d\u0430 \u043d\u0430\u0448 \u0434\u0430\u043c\u043f, \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0439 \u043d\u0430 \u0448\u0430\u0433\u0435 2 (\u043f\u0440\u0438\u043c\u0435\u0440 1), \u0432\u043e\u0442 \u043a\u0430\u043a\u043e\u0439 \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442 \u043d\u0430\u043c \u043d\u0443\u0436\u0435\u043d<\/p>\n<pre><code class=\"perl\">$VAR1 = [           'S',           'a',           {             'href' =&gt; 'http:\/\/habrahabr.ru\/hub\/photo\/',             'title' =&gt; '\u0412\u044b \u043d\u0435 \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043d\u044b \u043d\u0430 \u044d\u0442\u043e\u0442 \u0445\u0430\u0431',             'class' =&gt; 'hub '           },           [             'href',             'class',             'title'           ],           '&lt;a href=&quot;http:\/\/habrahabr.ru\/hub\/photo\/&quot; class=&quot;hub &quot; title=&quot;\u0412\u044b \u043d\u0435 \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043d\u044b \u043d\u0430 \u044d\u0442\u043e\u0442 \u0445\u0430\u0431&quot; &gt;'         ]; $VAR1 = [           'T',           '\u0424\u043e\u0442\u043e\u0442\u0435\u0445\u043d\u0438\u043a\u0430',           ''         ];  <\/code><\/pre>\n<p>  \u0412\u0441\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u0441\u0442\u043e, \u0435\u0441\u043b\u0438 \u043c\u044b \u0432\u043d\u0430\u0447\u0430\u043b\u0435 \u043d\u0430\u0439\u0434\u0435\u043c \u0441\u0441\u044b\u043b\u043a\u0443 \u0441 title =\u2018\u0412\u044b \u043d\u0435 \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043d\u044b \u043d\u0430 \u044d\u0442\u043e\u0442 \u0445\u0430\u0431\u2019 \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0442\u043e\u043a\u0435\u043d \u0438 \u0435\u0441\u043b\u0438 \u044d\u0442\u043e \u0442\u0435\u043a\u0441\u0442, \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u043c. <\/p>\n<p>  \u042f \u043f\u043e\u043a\u0430\u0436\u0443 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0434\u0440\u0443\u0433\u0443\u044e \u0442\u0435\u0445\u043d\u0438\u043a\u0443, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0431\u0430\u0437\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043d\u0430 \u0442\u043e\u043c, \u0447\u0442\u043e \u043c\u044b \u0437\u0430\u043f\u0438\u0445\u044b\u0432\u0430\u0435\u043c \u0442\u043e\u043a\u0435\u043d\u044b \u0432 \u0441\u0442\u0435\u043a, \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u044f \u0441\u0430\u043c\u044b\u0439 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u0442\u043e\u043a\u0435\u043d, \u0434\u043e \u0442\u0435\u0445 \u043f\u043e\u0440 \u043f\u043e\u043a\u0430 \u043d\u0435 \u0432\u0441\u0442\u0440\u0435\u0442\u0438\u043c \u0442\u043e, \u0447\u0442\u043e \u043d\u0443\u0436\u043d\u043e. \u0415\u0441\u043b\u0438 \u0436\u0435 \u043d\u0430\u043c \u043d\u0435 \u0432\u0441\u0442\u0440\u0435\u0442\u0438\u043b\u0441\u044f \u043d\u0443\u0436\u043d\u044b\u0439 \u0442\u043e\u043a\u0435\u043d \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c unget_token(). <\/p>\n<p>  \u041e\u0431\u0440\u0430\u0442\u0438\u043c \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0430 \u0434\u0440\u0443\u0433\u0443\u044e \u0437\u0430\u043a\u043e\u043d\u043e\u043c\u0435\u0440\u043d\u043e\u0441\u0442\u044c \u043f\u043e\u0441\u043b\u0435 \u043d\u0443\u0436\u043d\u044b\u0445 \u043d\u0430\u043c \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0434\u0435\u0442 \u0442\u043e\u043a\u0435\u043d \u0441 \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u044e\u0449\u0438\u043c \u0442\u0435\u0433\u043e\u043c <b>a<\/b><\/p>\n<pre><code class=\"perl\">$VAR1 = [           'T',           '\u0413\u0430\u0434\u0436\u0435\u0442\u044b. \u0423\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u0434\u043b\u044f \u0433\u0438\u043a\u043e\u0432',           ''         ]; $VAR1 = [           'E',           'a',           '&lt;\/a&gt;'         ];  <\/code><\/pre>\n<p>  \u0418\u0437\u043c\u0435\u043d\u0438\u043c habr_parse.pm<\/p>\n<pre><code class=\"perl\">package habr_parse; use strict; use warnings; use HTML::TokeParser; use HTML::Entities; use Data::Dumper; use Encode;  sub new { \tmy $class = shift;  \tmy $self = {};  \tbless ($self, $class);  }  sub get_page_links { \tmy $self = shift; \tmy $conf = shift;  \tmy @data; \t# get internal format #\t$conf-&gt;{content} = decode($conf-&gt;{cp},$conf-&gt;{content}); #\tprint Dumper ($conf); #\tdecode_entities($conf-&gt;{content});  \tmy $p = HTML::TokeParser-&gt;new(\\$conf-&gt;{content});   \tmy $tmp_conf = {};  \twhile (my $token = $p-&gt;get_token()) \t{  \t\t# we found our link \t\tif ($token-&gt;[0] eq 'S' && $token-&gt;[1] eq 'a' && defined ($token-&gt;[2]-&gt;{class}) && $token-&gt;[2]-&gt;{class}=~\/^\\s*button\\s+habracut$\/i) \t\t{ \t\t\t$tmp_conf-&gt;{href} = $token-&gt;[2]-&gt;{href};\t\t\t \t\t} \t\telsif ($token-&gt;[0] eq 'S' && $token-&gt;[1] eq 'div' && defined ($token-&gt;[2]-&gt;{class}) && $token-&gt;[2]-&gt;{class}  eq 'hubs') \t\t{ \t\t \tmy @next; \t\t\tmy $found=0;  \t\t\t# \u0432\u043d\u0430\u0447\u0430\u043b\u0435 \u0438\u0434\u0435\u0442 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438 \u043f\u043e \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044f\u043c \t\t\t$tmp_conf = {};  \t\t\tmy $token = $p-&gt;get_token();  \t\t\tpush @next, $token; \t\t\t \t\t\t# \u043f\u043e\u043a\u0430 \u043d\u0435\u0442 \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u044e\u0449\u0435\u0433\u043e\u0441\u044f \u0442\u0435\u0433\u0430 div (\u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0445 div \u043d\u0435 \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c). \t\t\twhile ($next[$#next][1] ne 'div') \t\t\t{ \t\t\t\tpush @next, $p-&gt;get_token();  #\t\t\t\tprint Dumper ($next[$#next][1]);  \t\t\t\t# \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u044e\u0449\u0438\u0439\u0441\u044f \u0442\u0435\u0433 \u0430 \t\t\t\tif ($next[$#next][0] eq 'E' && $next[$#next][1] eq 'a') \t\t\t\t{ \t\t\t\t\t# \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0439 \u0442\u0435\u0433 T \u0441 \u043d\u0443\u0436\u043d\u044b\u043c \u043d\u0430\u043c \u0442\u0435\u0433\u043e\u043c \t\t\t\t\tif ($next[$#next-1][0] eq 'T') \t\t\t\t\t{ \t\t\t\t\t\t# print\t$next[$#next-1][1] . &quot;\\n&quot;;  \t\t\t\t\t\tpush @{$tmp_conf-&gt;{cats}}, $next[$#next-1][1];   \t\t\t\t\t\t$found = 1; \t\t\t\t\t} \t\t\t\t} \t\t\t}  \t\t\tif (!$found) \t\t\t{ \t\t\t\t# \u0432\u043e\u0437\u0440\u0430\u0449\u0430\u0435\u043c\u0441\u044f \u043d\u0430 \u0438\u0441\u0445\u043e\u0434\u043d\u0443\u044e \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u043c\u044b \u043d\u0435 \u043d\u0430\u0448\u043b\u0438 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438 \t\t\t\t$p-&gt;unget_token(@next); \t\t\t}  \t\t\tpush @data, $tmp_conf;  \t\t}   \t} #\tprint Dumper ($p);\t \t \treturn \\@data; }   return 1; <\/code><\/pre>\n<p>  \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442<\/p>\n<pre><code class=\"perl\">$VAR1 = [           {             'cats' =&gt; [                         '\u0418\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u044f \u0438 \u043f\u0440\u043e\u0433\u043d\u043e\u0437\u044b \u0432 IT',                         '\u0411\u0443\u0434\u0443\u0449\u0435\u0435 \u0437\u0434\u0435\u0441\u044c'                       ],             'href' =&gt; 'http:\/\/habrahabr.ru\/post\/162053\/#habracut'           },           {             'cats' =&gt; [                         '\u0424\u043e\u0442\u043e\u0442\u0435\u0445\u043d\u0438\u043a\u0430',                         '\u0411\u0443\u0434\u0443\u0449\u0435\u0435 \u0437\u0434\u0435\u0441\u044c'                       ],             'href' =&gt; 'http:\/\/habrahabr.ru\/post\/163433\/#habracut'           },           {             'cats' =&gt; [                         '\u042d\u043b\u0435\u043a\u0442\u0440\u043e\u043d\u0438\u043a\u0430 \u0434\u043b\u044f \u043d\u0430\u0447\u0438\u043d\u0430\u044e\u0449\u0438\u0445',                         '\u0413\u0430\u0434\u0436\u0435\u0442\u044b. \u0423\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u0434\u043b\u044f \u0433\u0438\u043a\u043e\u0432',                         '\u0411\u0443\u0434\u0443\u0449\u0435\u0435 \u0437\u0434\u0435\u0441\u044c'                       ],             'href' =&gt; 'http:\/\/habrahabr.ru\/post\/163493\/#habracut'           },           {             'cats' =&gt; [                         'HTML',                         'CSS'                       ],             'href' =&gt; 'http:\/\/habrahabr.ru\/post\/163429\/#habracut'           },           {             'cats' =&gt; [                         '\u0416\u0435\u043b\u0435\u0437\u043e',                         '\u0411\u043b\u043e\u0433 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438 Intel'                       ],             'href' =&gt; 'http:\/\/habrahabr.ru\/company\/intel\/blog\/162293\/#habracut'           },           {             'cats' =&gt; [                         '\u0425\u0430\u0431\u0440\u0430\u0445\u0430\u0431\u0440 \u2014 \u0410\u043d\u043e\u043d\u0441\u044b',                         '\u0424\u0440\u0438\u043b\u0430\u043d\u0441',                         '\u0411\u043b\u043e\u0433 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438 \u0422\u0435\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u041c\u0435\u0434\u0438\u0430'                       ],             'href' =&gt; 'http:\/\/habrahabr.ru\/company\/tm\/blog\/163483\/#habracut'           },           {             'cats' =&gt; [                         '\u0412\u0435\u0431-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430',                         'Open source'                       ],             'href' =&gt; 'http:\/\/habrahabr.ru\/post\/163425\/#habracut'           },           {             'cats' =&gt; [                         '\u041f\u0435\u0440\u0435\u0432\u043e\u0434\u044b',                         '\u041e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u044b',                         'Open source'                       ],             'href' =&gt; 'http:\/\/habrahabr.ru\/post\/148911\/#habracut'           },           {             'cats' =&gt; [                         '\u041f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435'                       ],             'href' =&gt; 'http:\/\/habrahabr.ru\/post\/163445\/#habracut'           },           {             'cats' =&gt; [                         '\u0420\u0430\u0431\u043e\u0442\u0430 \u0441\u043e \u0437\u0432\u0443\u043a\u043e\u043c',                         '\u041d\u0435\u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435'                       ],             'href' =&gt; 'http:\/\/habrahabr.ru\/post\/163525\/#habracut'           }         ];  <\/code><\/pre>\n<p>  \u041f\u043e\u0434\u043e\u0431\u043d\u044b\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u0441 <b>unget_token()<\/b> \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0442\u0430\u043a\u0436\u0435 \u0438\u0441\u043a\u0430\u0442\u044c \u0442\u043e\u043a\u0435\u043d\u044b \u043f\u043e \u0443\u0440\u043e\u0432\u043d\u044e \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u043e\u0441\u0442\u0438. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043d\u0430\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0442\u0440\u0435\u0442\u0438\u0439 \u0442\u043e\u043a\u0435\u043d \u043f\u043e\u0441\u043b\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0433\u043e, \u0432\u0441\u0435 \u0447\u0442\u043e \u043d\u0443\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u044d\u0442\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0432 \u043c\u0430\u0441\u0441\u0438\u0432 \u0442\u0440\u0438 \u0442\u043e\u043a\u0435\u043d\u0430 \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439. \u0415\u0441\u043b\u0438 \u043e\u043d \u043d\u0435 \u0438\u0441\u043a\u043e\u043c\u044b\u0439 \u0442\u043e \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0432\u0441\u0435 \u0442\u043e\u043a\u0435\u043d\u044b \u0432 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043f\u043e\u0442\u043e\u043a \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <b>unget_token()<\/b><\/p>\n<p>  \u041f\u0440\u0438 \u0442\u0430\u043a\u043e\u043c \u043f\u043e\u0434\u0445\u043e\u0434\u0435 \u043a\u0430\u043a \u0432 HTML::TokeParser \u043d\u0435 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442\u0441\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043e \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u043e\u0441\u0442\u0438, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043a\u0430\u043a \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043c\u0430\u0441\u0441\u0438\u0432 \u0441 \u0442\u043e\u043a\u0435\u043d\u0430\u043c\u0438 \u0438 <b>unget_token()<\/b>.    \t   \t<\/p>\n<div class=\"clear\"><\/div>\n<\/p><\/div>\n<p> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"http:\/\/habrahabr.ru\/post\/163567\/\"> http:\/\/habrahabr.ru\/post\/163567\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div class=\"content html_format\">   \t\u041e\u0434\u043d\u0438\u043c \u0438\u0437 \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u0447\u0430\u0441\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0445 \u043c\u043d\u043e\u044e \u043c\u043e\u0434\u0443\u043b\u0435\u043c \u043f\u0440\u0438 \u043f\u0430\u0440\u0441\u0438\u043d\u0433\u0435 HTML \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f HTML::TokeParser. \u042d\u0442\u043e\u0442 \u043c\u043e\u0434\u0443\u043b\u044c \u0440\u0430\u0437\u0431\u0438\u0432\u0430\u0435\u0442 \u0432\u0435\u0441\u044c HTML \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442 \u043d\u0430 \u0442\u043e\u043a\u0435\u043d\u044b, \u0441 \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u043f\u043e\u0437\u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u0443\u0434\u043e\u0431\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c.<\/p>\n<p>  \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043a\u0430\u043a\u043e\u0439-\u043b\u0438\u0431\u043e \u043f\u0440\u0438\u043c\u0435\u0440 \u043d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435. \u0412\u043e\u0437\u044c\u043c\u0435\u043c \u0441\u0430\u0439\u0442 <a href=\"http:\/\/habrahabr.ru\/\">habrahabr.ru\/<\/a> <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-163567","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/163567","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=163567"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/163567\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=163567"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=163567"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=163567"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}