如何将多个 HTML 文件的内容合并到一个文件中?
How to merge content from multiple HMTL files in a single one?
我有 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>
并且我想将每个文件的第 2 table (TABLE[2]ROW[1]COLUMN[2]
) 的第 1 行第 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";
}
文档 HTML::TableExtract 声明 depth、count、row、col 从 0
开始。
以下代码是代码的 骨架 ,假设所有 html 文件都将存储在一个目录中。
在 glob 的帮助下,我们获得了 html 个文件的名称。
然后我们写一个子程序extract_table_cell
,我们传递参数depth,count,row,col
来提取位于这个位置的数据。
现在,对于每个文件名,我们调用 extract_table_cell
子程序并将 return 数据存储在数组 @data
.
中
我们还编写了子程序gen_html
,它引用了@data
数组和returns 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>
北极熊的回答可能是最好的回答。我只是想添加一个关于在不使用 HTML::TableExtract 的情况下获取 TABLE[2]ROW[1]COLUMN[2] 的不同想法。你说你是 perl 的新手,所以我认为这个想法对你来说会很有趣。这个想法是使用正则表达式。例如:
$/ = "</html>";
my $table2, $row1, $col2;
while(<STDIN>){
/<\/table>\s*<table>([^[=10=]0]*?)<\/table>/i;
$table2 = ;
$table2 =~ /<tr>([^[=10=]0]*?)<\/tr>/i;
$row1 = ;
$row1 =~ /<\/td>\s*<td>([^[=10=]0]*?)<\/td>/i;
$col2 = ;
}
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
我有 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>
并且我想将每个文件的第 2 table (TABLE[2]ROW[1]COLUMN[2]
) 的第 1 行第 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";
}
文档 HTML::TableExtract 声明 depth、count、row、col 从 0
开始。
以下代码是代码的 骨架 ,假设所有 html 文件都将存储在一个目录中。
在 glob 的帮助下,我们获得了 html 个文件的名称。
然后我们写一个子程序extract_table_cell
,我们传递参数depth,count,row,col
来提取位于这个位置的数据。
现在,对于每个文件名,我们调用 extract_table_cell
子程序并将 return 数据存储在数组 @data
.
我们还编写了子程序gen_html
,它引用了@data
数组和returns 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>
北极熊的回答可能是最好的回答。我只是想添加一个关于在不使用 HTML::TableExtract 的情况下获取 TABLE[2]ROW[1]COLUMN[2] 的不同想法。你说你是 perl 的新手,所以我认为这个想法对你来说会很有趣。这个想法是使用正则表达式。例如:
$/ = "</html>";
my $table2, $row1, $col2;
while(<STDIN>){
/<\/table>\s*<table>([^[=10=]0]*?)<\/table>/i;
$table2 = ;
$table2 =~ /<tr>([^[=10=]0]*?)<\/tr>/i;
$row1 = ;
$row1 =~ /<\/td>\s*<td>([^[=10=]0]*?)<\/td>/i;
$col2 = ;
}
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