2011-12-09 1 views
2

Я пишу скрипт для изменения содержимого html, и я застрял в двух проблемах. У меня есть эта структура html, которая является названиями фильмов и годами выпуска с эскизами, сгруппированными в 5 столбцов. Я хочу генерировать новые html-файлы с фильмами, сгруппированными по годам с 2011 по 1911 год, например. представить-2011; 2010-2001; 2000-1991; и т.д.Как переставить html-контент с помощью HTML :: Treebuilder

<table> 
    <tr> 
     <td class="basic" valign="top"> 
     <a href="details/267226.html" title="" id="thumbimage"> 
      <img src="images/267226f.jpg"/> 
     </a> 
     <br/>Cowboys &amp; Aliens &#160;(2011) 
</td> 
     <td class="basic" valign="top"> 
     <a href="details/267185.html" title="" id="thumbimage"> 
      <img src="images/267185f.jpg"/> 
     </a> 
     <br/>The Hangover Part II &#160;(2011) 
</td> 
     <td class="basic" valign="top"> 
     <a href="details/267138.html" title="" id="thumbimage"> 
      <img src="images/267138f.jpg"/> 
     </a> 
     <br/>Friends With Benefits &#160;(2011) 
</td> 
     <td class="basic" valign="top"> 
     <a href="details/266870.html" title="" id="thumbimage"> 
      <img src="images/266870f.jpg"/> 
     </a> 
     <br/>Beauty And The Beast &#160;(1991) 
</td> 
     <td class="basic" valign="top"> 
     <a href="details/266846.html" title="" id="thumbimage"> 
      <img src="images/266846f.jpg"/> 
     </a> 
     <br/>The Fox And The Hound &#160;(1981) 
</td> 
    </tr> 


...... 

</table> 

Одна проблемы, я понятия не имею, как решить, что после удаления фильмов не соответствующих декады я остался с пустыми «» т.р. тегами и позицией эскизов и не знаю, как снова изменить каждая строка из 5 столбцов заполнена 5 заголовками. А также, как обрабатывать каждое десятилетие с помощью одного вызова скрипта. Благодарю.

use autodie; 
use strict; 
use warnings; 
use File::Slurp; 
use HTML::TreeBuilder;  

my $tree = HTML::TreeBuilder->new_from_file('test.html'); 

for my $h ($tree->look_down(class => 'basic')) { 

    edit_links($h);  

    my ($year) = ($h->as_text =~ /.*?\((\d+)\).*/); 
    if ($year > 2010 or $year < 2001) { 
     $h->detach; 
     write_file("decades/2010-2001.html", \$tree->as_HTML('<>&',' ',{}), "\n"); 
    } 
}  

sub edit_links { 
    my $h = shift; 

    for my $link ($h->find_by_tag_name('a')) { 
     my $href = '../'.$link->attr('href'); 
     $link->attr('href', $href); 
    } 

    for my $link ($h->find_by_tag_name('img')) { 
     my $src = '../'.$link->attr('src'); 
     $link->attr('src', $src); 
    } 
} 

ответ

0

Подход, указанный ниже, должен делать то, о чем вы хотели. Во время обработки HTML-файла создается хэш-код %decade, каждый из которых заканчивает год десятилетия и значение arrayref соответствующих ячеек.

Вторая петля пересекает хэш-файл и выводит файл за каждое десятилетие, окружая каждые 5 ячеек с помощью метки <tr>.

use strict; 
use HTML::TreeBuilder; 
use File::Slurp; 
use List::MoreUtils qw(part); 

my $tree = HTML::TreeBuilder->new_from_file('test.html'); 

my %decade =(); 

for my $h ($tree->look_down(class => 'basic')) { 

    edit_links($h); 

    my ($year) = ($h->as_text =~ /.*?\((\d+)\).*/); 
    my $dec = (int($year/10) + 1) * 10; 

    $decade{$dec} ||= []; 
    push @{$decade{$dec}}, $h; 
} 

for my $dec (sort { $b <=> $a } keys %decade) { 
    my $filename = "decades/" . $dec . "-" . ($dec - 9) . ".html"; 

    my $idx = 0; 
    my @items = map { $_->as_HTML('<>&',' ',{}) } @{ $decade{$dec} }; 
    my $contents = join('', 
     '<table>', 
     (map { "<tr>@$_</tr>" } part { int($idx++/5) } @items), 
     '</table>'); 

    write_file($filename, $contents); 
} 

... 
+0

Это решение наиболее решительно из моей лиги. Я не могу вас поблагодарить. Отлично! – thebourneid