2012-08-17 56 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];