2013-02-10 4 views
0

나는 여러 테이블과 HTML 파일을 (모든 테이블 컬럼과 동일한 열 이름의 같은 번호가) 있습니다. 테이블은 다른 HTML 태그로 구분됩니다.업데이트 열 값 :: TreeBuilder

#!/usr/bin/env perl 
use strict; 
use warnings; 
use utf8; 
use open qw(:std :utf8); 

use HTML::TreeBuilder; 

my $input_file_name = shift; 

my $tree = HTML::TreeBuilder->new(); 
$tree->parse_file($input_file_name) or die "Cannot open or parse $input_file_name\n"; 
$tree->elementify(); 

my @tables = $tree->find_by_tag_name('table'); 
for my $table (@tables) { 
    foreach my $row ($table->find_by_tag_name('tr')) { 
     foreach my $column ($table->find_by_tag_name('td')) { 
      # how do I change the text of first and 3rd column text to "removed" 
     } 
    } 
} 

print $tree->as_HTML(); 
exit; 

그것을 각 테이블의 각 행에 대해

, 나는이 내가 지금까지 (감사 @depesz하는) 것을 셀 (1)과 세포 3.

의 값을 변경하려면 HTML 파일의 모든 행을 반복하는 데 효과적입니다. 1과 3 열의 텍스트를 변경하는 마지막 방법을 잘 모릅니다.

답변

3

HTML::TreeBuilder::XPath 모듈을 사용하면 문서의 HTML 노드에 훨씬 편리하게 액세스 할 수 있습니다.

예를 들어이 프로그램을 살펴 보자. 그것은 당신이 필요로하는 것을하는 것처럼 보입니다. 마법처럼

use strict; 
use warnings; 

use HTML::TreeBuilder::XPath; 

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

for my $table ($tree->findnodes('//table')) { 
    my $row = 0; 
    for my $tr ($table->findnodes('//tr')) { 
    $row++; 
    for my $td ($tr->findnodes('td[position() = 1 or position() = 3]')) { 
     $td->delete_content; 
     $td->push_content("name$row"); 
    } 
    } 
} 

print $tree->as_HTML('<>&', ' '); 
+0

작품. 고맙습니다! – smithy