【问题标题】:How to merge content from multiple HMTL files in a single one?如何将多个 HTML 文件中的内容合并到一个文件中?
【发布时间】:2020-07-05 18:29:00
【问题描述】:

我有 100 多个具有以下结构的 html 文件。

<html>
<head>
<body>
    <TABLE>
      ...
    </TABLE>
    <TABLE>
        <TR>
            <td rowspan=2><img src="http://www.example.com" width=10></td>
            <TD width=609 valign=top>
                <!-- Content of file1 -->
                <p>abc</p>
                ...
                ...
                ...
                <p>xyz</p>
            </TD>
        </TR>
        <TR>
            <TD align="center" ...alt="top"></a></TD>
        </TR>
    </TABLE>        
</body>
</html>

我想将每个文件的第二个表 (TABLE[2]ROW[1]COLUMN[2]) 的第一行的第 2 列内的内容合并到一个 HTML 中,以获得这样的输出

<html>
<head>
<body>
    <!-- Content of file1 -->
    <p>abc</p>
    ...
    ...
    ...
    <p>xyz</p>

            <!-- Content of file2 -->
    <p>some text</p>
    ...
    ...
    ...
    <p>some text</p>

    ..
    ..
    ..
            <!-- Content of fileN -->
    <p>some text</p>
    ...
    ...
    ...
    <p>some text</p>
</body>
</html>

我是 perl 的新手,我请求一些帮助以指出我如何做到这一点。提前致谢。

下面开始为file1写一篇文章,但我不确定我是否走对了。

use HTML::TableExtract;

open (my $html,"<","file1.html");

my $table = HTML::TableExtract->new(keep_html=>0, depth => 1, count => 2, br_translate => 0 );
$table->parse($html);

foreach my $row ($table->rows) {
    print join("\t", @$row), "\n";
}

【问题讨论】:

    标签: perl html-tableextract


    【解决方案1】:

    文档HTML::TableExtract 指出深度、计数、行、列0 开始。

    以下代码是代码的骨架,假设所有 html 文件都将存储在一个目录中。

    glob 的帮助下,我们获得了 html 文件的名称。

    然后我们编写一个子程序extract_table_cell,我们传递参数depth,count,row,col来提取位于该位置的数据。

    现在对于每个文件名,我们调用extract_table_cell 子例程并将返回数据存储在数组@data 中。

    我们还编写了子程序gen_html,它引用@data数组并返回代表这些数据的html代码。

    此时我们调用say 并带有子程序gen_html 作为输出结果的参数。

    注意:您需要更改子程序extract_table_cell 以获得所需的单元格数据格式

    use strict;
    use warnings;
    use feature 'say';
    
    use HTML::TableExtract;
    
    my($depth,$table,$row,$col) = (0,1,0,1);
    my @data;
    
    for (glob("*.html")) {
        push @data, extract_table_cell($_,$depth,$table,$row,$col);
    }
    
    say gen_html(\@data);
    
    sub gen_html {
        my $data = shift;
    
        my($html,$block);
    
        for ( @{$data} ) {
            $block .= "\t\t$_\n";
        }
    
        $html =
    "
    <html>
        <head>
        </head>
        <body>
        $block
        </body>
    </html>
    ";
    
        return $html;
    }
    
    sub extract_table_cell {
        my($file,$depth,$count,$row,$col) = @_;
    
        my $te = HTML::TableExtract->new( depth => $depth, count => $count );
    
        $te->parse_file($file);
    
        my $table = $te->first_table_found;
    
        return ${ $table->{grid}[$row][$col] };
    }
    

    输出

    <html>
        <head>
        </head>
        <body>
            B 1.2
            D 1.2
    
        </body>
    </html>
    

    测试数据文件:

    table_1.html

    <html>
        <head>
        </head>
        <body>
            <table>
                <tr><td>A 1.1</td><td>A 1.2</td><td>A 1.3</td></tr>
                <tr><td>A 2.1</td><td>A 2.2</td><td>A 2.3</td></tr>
                <tr><td>A 3.1</td><td>A 3.2</td><td>A 3.3</td></tr>
                <tr><td>A 4.1</td><td>A 4.2</td><td>A 4.3</td></tr>
            </table>
    
            <table>
                <tr><td>B 1.1</td><td>B 1.2</td><td>B 1.3</td></tr>
                <tr><td>B 2.1</td><td>B 2.2</td><td>B 2.3</td></tr>
                <tr><td>B 3.1</td><td>B 3.2</td><td>B 3.3</td></tr>
                <tr><td>B 4.1</td><td>B 4.2</td><td>B 4.3</td></tr>
            </table>
        </body>
    </html>
    

    table_2.html

    <html>
        <head>
        </head>
        <body>
            <table>
                <tr><td>C 1.1</td><td>C 1.2</td><td>C 1.3</td></tr>
                <tr><td>C 2.1</td><td>C 2.2</td><td>C 2.3</td></tr>
                <tr><td>C 3.1</td><td>C 3.2</td><td>C 3.3</td></tr>
                <tr><td>C 4.1</td><td>C 4.2</td><td>C 4.3</td></tr>
            </table>
    
            <table>
                <tr><td>D 1.1</td><td>D 1.2</td><td>D 1.3</td></tr>
                <tr><td>D 2.1</td><td>D 2.2</td><td>D 2.3</td></tr>
                <tr><td>D 3.1</td><td>D 3.2</td><td>D 3.3</td></tr>
                <tr><td>D 4.1</td><td>D 4.2</td><td>D 4.3</td></tr>
            </table>
        </body>
    </html>
    

    【讨论】:

    • 是的 $ which env /usr/bin/env 这次可以了。我尝试了 2 个真实文件,但出现此错误 $ ./script.pl &gt; out.html Wide character in say at ./script.pl line 16.
    • @GeCas -- 这个错误与完全不同的 UTF 区域有关,我猜你处理的德语文本超出了 ASCII 范围。您需要指出您的输入和输出可能使用 UTF-8 编码(可能 UTF-16 非常罕见,因为 UTF-8 在 Web 云上更常用)。请参阅以下documentation 以打开编码文件。可能在您的情况下,使用 locale 方法可能就足够了。
    • @GerCas -- perl 代码中有关utf8 的一些信息。 How can I output UTF-8 from Perl?.
    • @GerCas -- 如果您查看HTML::ExtractTable 的文档,有一个选项keep_html 可以在提取的数据中保留html 标记。您只需要在创建$te 对象时激活此选项。
    • @GerCas -- 如果您拥有或将拥有大量数据,那么将数据存储在数据库SQLiteMariaDBMySQLPostgreSQL 中可能是有意义的。它比从文件中读取要快得多,并且使用 SQL 你可以像 circus juggler man 一样 slice and dice,然后只是如何呈现数据的问题:html 、文本文件、PDF 文件、Latex 文件或其他文件。在DBI 的帮助下,Perl 非常适合数据库。
    【解决方案2】:

    北极熊的答案可能是最好的答案。我只是想添加一个关于在不使用 HTML::TableExtract 的情况下获取 TABLE[2]ROW[1]COLUMN[2] 的不同想法。你说你是 perl 的新手,所以我认为这个想法对你来说会很有趣。这个想法是使用正则表达式。例如:

    $/ = "</html>";
    my $table2, $row1, $col2;
    while(<STDIN>){
        /<\/table>\s*<table>([^\000]*?)<\/table>/i;
        $table2 = $1;
        $table2 =~ /<tr>([^\000]*?)<\/tr>/i;
        $row1 = $1;
        $row1 =~ /<\/td>\s*<td>([^\000]*?)<\/td>/i;
        $col2 = $1;
    }
    print $col2;
    

    此代码将始终获得 TABLE[2]ROW[1]COLUMN[2]。

    示例输入:

    <html>
    <table>
    
    </table>
    <table>
        <tr>
            <td>
              hello world
            </td>
            <td>
              corona 
            </td>
        </tr>
        <tr>
        </tr>
    </table>
    </html>
    

    输出:

      corona 
    

    【讨论】:

    • 您好,glennmark,感谢您的回答。我试图测试你的代码。我粘贴了您的代码并将其保存在script.plsample.html 中的示例输入,但是当我这样运行它时,我没有得到任何输出perl script.pl sample.html 正确的测试方法是什么?
    • 你运行它的方式是正确的。当我检查您的问题时,我看到一些标签是大写的。我将编辑我的答案来处理这些。您还可以在测试期间将所有 html 合并到一个 html 文件中。我的代码并不是你想要的。更好的方法是遍历文件,获取您想要的数据,然后将其推送到数组中(参见 Polar Bear 的代码以了解如何操作)
    • 感谢 glennmark 的帮助和分享的方法。
    猜你喜欢
    • 1970-01-01
    • 2020-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多