2012-04-11 10 views
0

これは本当に基本的なことです。しかし、私はPerlを知らず、これを一度だけ使う必要があります。だから私はあなたの忍耐を感謝します。Perlスクリプトが1つのファイルから出力ファイルに単語を削除する

私は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> 

私が残ることにしたいすべてが</a>前最後のテキストであるRun Printable TCI List (<i>Revised</i>)です。私はこれらの行のうち約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

+0

問題は、理由のためにそこにあったものをのままにしたかったということでした。本当に問題があるかどうかを確認するために、この時点で周りを見ていたので、混乱させて申し訳ありません。ご意見ありがとうございます。 – Marshal

+0

私はあなたの質問を誤解していた理由を今見ています。 StackOverflowのマークアップは、使用したHTMLタグを飲み込んでいたので、表示されたときには表示されませんでした。また、あなたが投稿した2つのサンプル出力文字列は、そのうちの1つの偽の二重引用符とは別に同じものでした。私は自分の投稿を編集して、あなたが思っていると思うものを表示し、新しい解決策を提供するために私の答えに加えました。私の前提が正しいかどうか私に教えてください。 – Borodin

答えて

0

。このプログラムは、あなたの例では、ファイルにコードをこの手法を使用するには

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::TreeBuilderで必要な結果を得ることは比較的困難であるため、文書オブジェクトモデルのHTML文書にアクセスします。

あなたのサンプル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

+0

ご協力いただきありがとうございます! – Marshal

0

これは1つのライナーで行うことができます。

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

それは働いている:あなたはこのようなHTML::TreeBuilderとして、適切なHTMLパーサを使用する必要があります

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

'cat'は役に立たない、余分なプロセスです。それを落としてPerlに入力ファイルを直接読み込ませてください: 'perl -ne '...' inputfile> outputfile' – JRFerguson

+0

はい、それは可能ですが、私はこの方法が好きです。これは、パイプにインスクリプトされるスクリプトの能力を示しています。コメントありがとう。 – user1126070

+0

ありがとうございます!これは私を助けてくれました。 – Marshal

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

+0

これは、HTMLの属性の順序に依存しているため、非常に慣れていません。このようにしないでください。 –

関連する問題