1

我有带有 HTML 表格的文档。有些单元格只有数字。其他单元格有数字和单词。

有没有办法只保留有单词的单元格的内容而不保留只有数字的单元格的内容?

是否有任何人都知道我可以用来执行此操作的模块?或者,无论如何我可以使用正则表达式吗?

<table>
<tr>
<td>WORDS WORDS WORDS WORDS WORDS WORDS 123</td>
<td> 789</td>
</tr>
<tr>
<td> 123 </td>
<td>WORDS WORDS</td>
</tr>
</table> 

我对 perl 还是很陌生,所以如果它很简单,请原谅我的问题。此外,我已经被警告过使用正则表达式解析 HTML 文本的潜在问题。

非常感谢!

最后,顺便说一句,我将使用一个模块来杀死所有的 HTML 代码。

4

2 回答 2

2

正如您已经说过的,不应使用正则表达式解析 HTML。像这样的专门解析模块HTML::Parser会有所帮助:

#!/usr/bin/env perl

use strict;
use warnings;

use HTML::Parser;

my $p = HTML::Parser->new( 'text_h' => [ \&text_handler, 'dtext' ] );
$p->parse_file(\*DATA);

sub text_handler {
    my $text = shift;
    $text =~ s/^\s*|\s*$//g;         # Trim leading and trailing whitespaces
    return if !$text || $text =~ /^[\d\s]+$/;

    print "$text\n";
}

__DATA__
<table>
<tr>
<td>WORDS WORDS WORDS WORDS WORDS WORDS 123</td>
<td> 789 558 </td>
</tr>
<tr>
<td> 123 </td>
<td>WORDS WORDS</td>
</tr>
</table>

输出:

WORDS WORDS WORDS WORDS WORDS WORDS 123
WORDS WORDS
于 2012-08-17T06:16:36.510 回答
2

您可以使用几个模块来执行此操作,我会HTML::TreeBuilder::XPath自己去。

#!/usr/bin/env perl

use v5.12;
use HTML::TreeBuilder::XPath;

my $tree = HTML::TreeBuilder::XPath->new;
$tree->parse_file("data.html");

my @cells = $tree->findnodes('//td');
foreach my $cell (@cells) {
    if ($cell->as_text =~ /^[0-9 ]+$/) {
        $cell->delete_content;
    }
}
print $tree->as_HTML;

使用的 XPath 引擎应该支持允许正则表达式的 XPath 扩展(这将允许我们消除下面循环中的测试)。不过,我的 XPath 能力无法在我现在可用的时间内让它工作。

#my @cells = $tree->findnodes( '//td[text() =~ /^[0-9 ]$/')->[0];
于 2012-08-17T06:27:55.430 回答