0

これは本当に基本的なことだと確信しています。しかし、私はPerlの知識がなく、これを1回だけ使用する必要があります。何卒ご理解とご協力を賜りますようお願い申し上げます。

以下のHTML形式の1行から不要なテキストを削除しようとしています。

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

これはきっと読めると思いますが、説明のためにsources.txt、500行のソート先というファイルを開いています。出力ファイルはになりますoutseark.txt。これまでのところ、これを出力します:

Run Printable TCI List (Revised)

これは明らかに、矢印の中と周りのすべてを狙った分割によるものです。括弧内にイタリックを保持する方法はありますか?残される:

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

見てくれてありがとう。

4

3 に答える 3

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;
于 2012-04-11T13:45:57.270 に答える
0

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

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>)
于 2012-04-11T12:25:56.337 に答える
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>
于 2012-04-11T16:25:32.953 に答える