2012-04-11 69 views
0

林相當肯定這是非常基本的。但是我不知道Perl,只需要使用它一次。所以我感謝你的耐心。低於該Perl腳本從一個文件中刪除單詞到輸出文件

我想從一個單行刪除不需要的文本是在HTML:

<a target="_blank"   href="http://sharepoint/sites/cerner/quickreferenceguides/Documents/EXP001_Run_Printable_TCI_List.pdf" onmouseover="return overlib('This guide outlines the process for running a printable TCI List', CAPTION, 'TCI LIST');" onmouseout="return nd();">Run Printable TCI List (<i>Revised<i>)</a> 

所有我想被留下的是Run Printable TCI List (<i>Revised</i>)是在</a>之前結束的文本。我有大約500條這樣的線路,並且由於它們將來可以改變,所以創建一個程序是有意義的。下面是我的Perl代碼至今:

open (SEARK, 'C:\\HTMLsorter\\sources.txt'); 
open (OUTSEARK, '>C:\\HTMLsorter\\outseark.txt'); 
while(<SEARK>) { 
    chomp; 

    if ($_=~/<a target/) { 
    $_ =~ s/\<i>//g; 
    $_ =~ s/\<\/i>//g; 
    @itemsa = split(/>/); 
    @itemsb = split(/</, $itemsa[1]); 
    print OUTSEARK ("$itemsb[0]\n"); 
    } 
} 
close (SEARK); 
close (OUTSEARK); 

我敢肯定,你可以閱讀這只是說明那裏有要排序的500行,我打開一個叫sources.txt文件。輸出文件將是outseark.txt。到目前爲止,它會輸出這樣的:

Run Printable TCI List (Revised) 

這顯然是由於拆分瞄準和周圍的箭頭的一切。任何想法如何將斜體保留在括號內?要留下:

Run Printable TCI List (<i>Revised<i>) 

感謝您的期待。

+1

我不明白的問題。當應用於樣本數據時,您的代碼會完全生成您所需的輸出(減去雙引號)。是否可以通過在以後添加's \\ // g'等來修復它? – Borodin 2012-04-11 16:13:32

+0

那麼問題是我想離開那些的,因爲他們在那裏是有原因的。很抱歉,因爲我在這一點上正在調查,以檢查是否確實是問題。感謝您的評論。 – Marshal 2012-04-18 09:14:12

+0

我現在看到爲什麼我誤解了你的問題。 StackOverflow標記吞噬了您使用的HTML標記,並且它們在顯示的問題中不可見。另外,您發佈的兩個示例輸出字符串與其中一個虛假雙引號相同。我編輯了你的帖子以顯示我認爲你打算的內容,並且還添加了我的答案以提供新的工作解決方案。請讓我知道我的假設是否正確。 – Borodin 2012-04-19 11:09:28

回答

0

你應該使用正確的HTML解析器,如HTML::TreeBuilder。該代碼是沒有更爲複雜,因爲這個程序演示

use strict; 
use warnings; 

use HTML::TreeBuilder; 

my $tree = HTML::TreeBuilder->new_from_file(*DATA); 

print $_->as_text, "\n" for $tree->look_down(_tag => 'a', target => qr/./); 

__DATA__ 
    <a target="_blank"   href="http://sharepoint/sites/cerner/quickreferenceguides/Documents/EXP001_Run_Printable_TCI_List.pdf" onmouseover="return overlib('This guide outlines the process for running a printable TCI List', CAPTION, 'TCI LIST');" onmouseout="return nd();">Run Printable TCI List (<i>Revised<i>)</a> 

輸出

Run Printable TCI List (Revised) 

編輯

要在您的例子中使用的文件這種技術,代碼看起來像這樣

use strict; 
use warnings; 

use HTML::TreeBuilder; 

my $tree = HTML::TreeBuilder->new_from_file('C:\HTMLsorter\sources.txt'); 

open my $out, '>', 'C:\HTMLsorter\outseark.txt' or die $!; 

print $out $_->as_text, "\n" for $tree->look_down(_tag => 'a', target => qr/./); 

編輯2

現在我更好地瞭解你需要什麼,我可以提供這種替代解決方案。它使用HTML::DOM模塊訪問HTML文檔的文檔對象模型,因爲獲得HTML::TreeBuilder所需的結果相對困難。

我也注意到,您的示例HTML包含<i>Revised<i>,顯然應該是<i>Revised</i>,並且我已經對此示例測試進行了更正。無論如何,Perl試圖按照瀏覽器解析錯誤的HTML,即使輸出錯誤也是可用的。

use strict; 
use warnings; 

use HTML::DOM; 

my $dom = HTML::DOM->new; 
$dom->parse_file('C:\HTMLsorter\sources.txt') or die $!; 

open my $out, '>', 'C:\HTMLsorter\outseark.txt' or die $!; 
print $out $_->innerHTML, "\n" for grep $_->attr('target'), $dom->getElementsByTagName('a'); 

輸出

(帶標籤校正)

Run Printable TCI List (<i>Revised</i>) 

(含原標籤)

Run Printable TCI List (<i>Revised<i>)</i></i> 
+0

@downvoter:請解釋我的錯誤? – Borodin 2012-04-12 00:51:59

+0

謝謝你的幫助! – Marshal 2012-04-18 09:11:42

0

你可以在一個班輪中做到這一點。

cat inputfile|perl -ne 'if (s#<a\s+target[^>]+>(.+?)</a>##is){print "$1\n";}'>outputfile 

據工作:

echo '<a target="_blank"   href="http://sharepoint/sites/cerner/quickreferenceguides/Documents/EXP001_Run_Printable_TCI_List.pdf" onmouseover="return overlib('This guide outlines the process for running a printable TCI List', CAPTION, 'TCI LIST');" onmouseout="return nd();">Run Printable TCI List (<i>Revised<i>)</a> 
<a target="_blank"   href="http://sharepoint/sites/cerner/quickreferenceguides/Documents/EXP001_Run_Printable_TCI_List.pdf" onmouseover="return overlib('This guide outlines the process for running a printable TCI List', CAPTION, 'TCI LIST');" onmouseout="return nd();">Run Printable TCI List 1(<i>Revised<i>)</a> 
<a target="_blank"   href="http://sharepoint/sites/cerner/quickreferenceguides/Documents/EXP001_Run_Printable_TCI_List.pdf" onmouseover="return overlib('This guide outlines the process for running a printable TCI List', CAPTION, 'TCI LIST');" onmouseout="return nd();">Run Printable TCI List 2(<i>Revised<i>)</a> 
<a target="_blank"   href="http://sharepoint/sites/cerner/quickreferenceguides/Documents/EXP001_Run_Printable_TCI_List.pdf" onmouseover="return overlib('This guide outlines the process for running a printable TCI List', CAPTION, 'TCI LIST');" onmouseout="return nd();">Run Printable TCI List 3(<i>Revised<i>)</a>'|\ 
perl -ne 'if (s#<a\s+target[^>]+>(.+?)</a>##is){print "$1\n";}' 

Run Printable TCI List (<i>Revised<i>) 
Run Printable TCI List 1(<i>Revised<i>) 
Run Printable TCI List 2(<i>Revised<i>) 
Run Printable TCI List 3(<i>Revised<i>) 
+2

'貓'是一個無用的額外過程。放下它,讓Perl直接讀取輸入文件:'perl -ne'...'inputfile> outputfile' – JRFerguson 2012-04-11 13:01:20

+0

是的,它是可能的,但我喜歡這種方式。它顯示腳本能夠被包含在管道中。感謝您的評論。 – user1126070 2012-04-11 13:32:12

+0

謝謝你的幫助!這對我有很大的幫助。 – Marshal 2012-04-18 09:12:06

1
#!/usr/bin/perl 
use strict; 
use warnings; 

open IFH, '<myfile.txt'; 
open OFH, '>output.txt'; 

while (<IFH>) { 
    if (/<a\s+target.*?>(.*?)<\/a>/i) 
    { 
    $_ = $1; 
    s/<.*?>//g; 
    print OFH "$_\n"; 
    } 
} 

close IFH; 
close OFH; 
+0

謝謝你的回答,對於遲到的回覆感到抱歉。這幫了很多。 – Marshal 2012-04-18 09:09:49

+0

這是非常糟糕的做法,因爲它依賴於HTML中的屬性順序。不要這樣做。 – 2012-05-01 16:31:54

相關問題