0

私は、参考文献を含むhtmlファイルを取り、著者以外のすべてを取り除く何かに取り組んできました。HTML タグ内の文字などの無関係なデータを取り除くのに苦労しています。タグ全体、またはさらに良いことに、タグ間の特定のデータを取り除くことができるようにしたいと思います。

今ここに私のサブがどのように見えるかです:

    sub extractAuthorsIntoArray{
        @author_array = split /[<>"\/?!.=\(\)1234567890':]/, $doc;
        foreach(@author_array){
            print "$_" . "\n";
        }
    }

現時点では、すべてのタグ文字を削除していますが、公開日や公開名など、必要のない不要なデータがたくさん残っています。「< li >」と言うのを取り除こうとするたびに、それらの文字が完全に欠落している新しいデータが返されます。とにかく叩き続けます。

後で。

編集:

私がやりたいのは、次のようなものです。

< li value="2">Artem Chebotko および Shiyong Lu、< b>「SPARQL のネストされたオプションのグラフ パターンを効率的に評価するためのネストされたオプションの結合」< /b>。< i>Semantic Web Evolution の進歩的な概念: アプリケーションと開発</i>、Miltiadis Lytras および Amit Sheth (Eds.)、Information Science Publishing、ISBN 160566992X、2010.< br/>< br/></li> < li>Artem Chebotko、Shiyong Lu、Farshad Fotouhi、および Anthony Aristar による< b>「セマンティック Web 用のマルチメディア言語データのオントロジー ベースのアノテーション」</b>。< i>Semantic Web-Based Information Systems: State-of-the-Art Applications</i>、Amit Sheth and Miltiadis Lytras (Eds.)、IGI Global、ISBN 1599044269、2006.< br/>< br/>< /li>

そして、これで終わります:

Artem Chebotko と Shiyong Lu

4

4 に答える 4

1

それはかなり...珍しい...使用方法splitです。通常、区切り記号で区切られた複数のデータ項目を含むデータがある場合に使用され、これらの区切り記号でデータを分割し、個々の項目を取得します。これはあなたがここでやろうとしていることではsplitないので、おそらくあなたが探しているドロイドコマンドではありません。

既に述べたように、適切な HTML パーサーはこれを行うための正しい方法ですが、特に教育目的で正規表現を使用したいので、1 つ紹介します。正規表現を使用して HTML を解析することには危険が伴い、ほとんどの場合、これが失敗する稀なケースがあることに注意してください。

それで、それは言った:

#!/usr/bin/env perl    

use strict;
use warnings;
use 5.010;

my $text = q[< li value="2">Artem Chebotko and Shiyong Lu, < b>"Nested Optional Join for Efficient Evaluation of SPARQL Nested Optional Graph Patterns"< /b>. < i>Progressive Concepts for Semantic Web Evolution: Applications and Developments< /i>, Miltiadis Lytras and Amit Sheth (Eds.), Information Science Publishing, ISBN 160566992X, 2010.< br/>< br/>< /li> < li>Artem Chebotko, Shiyong Lu, Farshad Fotouhi, and Anthony Aristar, < b>"Ontology-Based Annotation of Multimedia Language Data for the Semantic Web"< /b>. < i>Semantic Web-Based Information Systems: State-of-the-Art Applications< /i>, Amit Sheth and Miltiadis Lytras (Eds.), IGI Global, ISBN 1599044269, 2006.< br/>< br/>< /li>];

my @list_items = $text =~ m[<\s*li(?:\s+[^>]*)?>(.*?)<\s*/li\s*>]g;

my @authors;
for (@list_items) {
  /([^<]+), </;
  push @authors, $1;
}

say for @authors;

出力:

Artem Chebotko and Shiyong Lu
Artem Chebotko, Shiyong Lu, Farshad Fotouhi, and Anthony Aristar
于 2013-03-17T09:06:20.163 に答える
1

私の推奨事項: 正規表現は使用しないでください。その代わりに、HTML::Parserまたは CPAN で利用可能な多くのモジュールの 1 つを使用してください。

于 2013-03-17T08:02:12.167 に答える
1

一般に、データの構造についてある程度の確実性がなければ問題を解決するのは困難ですが、あなたの例に基づいて、著者は常にデータの最初の非タグコンテンツであり、コンマで終了すると仮定します(これはかなり一般的な形式です)。

つまり、問題には 2 つの部分があることを意味します。最初の HTML タグをすべて削除し、カンマ以降をすべて削除します。

第一に、HTML タグは非常に簡単に認識できます。なぜなら、HTML タグはこれらの文字で始まり<>これらの文字のいずれかを含むことができないからです。そう:

$line =~ s{ \A \s* (?: < [^>]+ > \s* )+ }{}xms;

行の先頭にあるすべての HTML タグ (および空白) を削除します。(これは、Perl Best Practices/xで推奨されているように、フラグおよびその他のコーディング スタイルを使用します。) この手順を順を追って実行すると、文字列の先頭に一致し、任意の量の空白に一致し、コアは です。タグの開始から、タグの終了まで 1 つ以上の文字を取ります。これは、任意の数を許可するために囲まれています。(その試合を維持することを気にしない場合は、キャプチャをオフにするのがベストプラクティスであるため、代わりに使用しています。)\A\s*< [^>]+ >(?: )+(?:)()

後でカンマからすべてを削除する方がはるかに簡単です。

$line =~ s{ , .* }{}xms;

ここで、これは、各参考文献エントリがプログラム内の単一のスカラーであると想定しています。それはかなり大きな問題を覆い隠しています。代わりに、ページ全体を含む変数がある場合は、それを解析する必要がある場合があります。各エントリが<li>タグの場合、各タグのコンテンツを抽出し<li>て、上記のように処理します。

/gこれを行うには、次のようなオプションを使用してリスト コンテキストで一致させます。

my @entries = ($doc =~ m{ <li (?: \s [^>] )? > (.*?) </li> }xmsg);

ここにいくつかの微妙な点があります。オプションの後の(?: )?ビットは、そのタグに任意の属性を許可する<li以外のいくつかの文字が続く空白に一致します。>この(.*?)部分は、タグのコンテンツを抽出する実際の作業を行います。?の後に注意してください*。つまり、ドキュメントの最後の タグまでのすべてに一致するのではなく、最初のタグまでのすべてに一致します。最後に、修飾子は、この一致を可能な限り繰り返し、キャプチャの内容をリストとして返すように指示します。</li> </li>/g()

于 2013-03-17T08:53:20.480 に答える
0
#!/usr/bin/perl -w

use strict;
read DATA, my $string, -s DATA;
my @matches = ( $string =~ /<\s+li\s*(?:.*?)>(.+?),\s+<\s+b>/g );
print "$_\n\n" foreach (@matches);

__DATA__
< li value="2">Artem Chebotko and Shiyong Lu, < b>"Nested Optional Join for Efficient Evaluation of SPARQL Nested Optional Graph Patterns"< /b>. < i>Progressive Concepts for Semantic Web Evolution: Applications and Developments< /i>, Miltiadis Lytras and Amit Sheth (Eds.), Information Science Publishing, ISBN 160566992X, 2010.< br/>< br/>< /li> < li>Artem Chebotko, Shiyong Lu, Farshad Fotouhi, and Anthony Aristar, < b>"Ontology-Based Annotation of Multimedia Language Data for the Semantic Web"< /b>. < i>Semantic Web-Based Information Systems: State-of-the-Art Applications< /i>, Amit Sheth and Miltiadis Lytras (Eds.), IGI Global, ISBN 1599044269, 2006.< br/>< br/>< /li>

この特定の問題を解決したい場合は、正規表現が探すべきものは次のいずれかです。

a) < li value="2">AUTHORS, < b>
b) < li>AUTHORS, < b>

a) 1 つの可能な正規表現は次のとおりです。

< \s+ li \s+ value="2"> (.+), \s+ <\s+b>

b) の場合、1 つの可能な正規表現は次のとおりです。

< \s+ li> (.+), \s+ <\s+b>

これら 2 つの正規表現を組み合わせると、次のようになります。

<\s+li\s*(?:.*?)>(.+?),\s+<\s+b>

エレガントではありませんが、役立つかもしれません。

于 2013-03-17T09:16:30.340 に答える