【问题标题】:Update column values in an HTML file using HTML::TreeBuilder使用 HTML::TreeBuilder 更新 HTML 文件中的列值
【发布时间】:2013-02-10 15:07:11
【问题描述】:

我有一个包含多个表格的 HTML 文件(所有表格都有相同的列数和相同的列名)。表格由其他 HTML 标记分隔。

对于每个表中的每一行,我想更改单元格 1 和单元格 3 的值。

这是我目前所拥有的(感谢@depesz):

#!/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;

它非常适合遍历 HTML 文件中的所有行。我只是不确定如何更改第 1 列和第 3 列中的文本。

【问题讨论】:

    标签: perl html-tree


    【解决方案1】:

    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('<>&', '  ');
    

    【讨论】:

    • 像魅力一样工作。谢谢!
    猜你喜欢
    • 2012-01-17
    • 1970-01-01
    • 2014-10-09
    • 2012-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-10
    相关资源
    最近更新 更多