2012-08-17 55 views
1

我有HTML表格的文档。有些单元格只有数字。其他单元格包含数字和单词。如何从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代码。

回答

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 
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];