Как объединить контент из нескольких файлов HMTL в один? - PullRequest
0 голосов
/ 25 марта 2020

У меня более 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>

, и я хотел бы объединить в один HTML содержимое в столбце № 2 1-й строки из 2-я таблица (TABLE[2]ROW[1]COLUMN[2]) каждого файла для получения вывода, подобного этому

<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, но я не уверен, правильно ли я go.

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";
}

Ответы [ 2 ]

2 голосов
/ 25 марта 2020

Документация HTML :: TableExtract гласит, что глубина, число, строка, столбец начинается с 0.

Следующий код представляет собой остов кода с предположением, что все html файлы будут храниться в одном каталоге.

С помощью glob получаем имена html файлов.

Затем мы пишем подпрограмму extract_table_cell, в которую передаем параметры depth,count,row,col для извлечения данных, расположенных в этой позиции.

Теперь для каждого имени файла мы вызываем подпрограмму extract_table_cell и сохраняем возвращаемые данные в массив @data.

Также мы пишем подпрограмму gen_html, которая ссылается на массив @data и возвращает html код, представляющий эти данные.

At эту точку мы называем скажем с подпрограммой 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>
1 голос
/ 25 марта 2020

Ответ Полярного Медведя может быть лучшим. Я просто хочу добавить другую идею о получении TABLE [2] ROW [1] COLUMN [2] без использования HTML :: TableExtract. Вы сказали, что вы новичок в 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;

Этот код всегда будет иметь значение ТАБЛИЦА [2] ROW [1] COLUMN [2].

Пример ввода:

<html>
<table>

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

Вывод:

  corona 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...