0

一部のWebサイトからデータをフェッチして処理するためにPerlWWW::Mechanizeパッケージを使用しています。通常、私の行動方法は次のとおりです。

  1. Webページを取得する

    $mech->get("$url");

  2. Webページのコンテンツを変数に保存します(ところで、私が知る限り、単一の値に使用されるはずのスカラー内にこの量のテキストを保存するのが正しい方法かどうかはわかりません)

    my $list = $mech->content();

  3. 私が作成したサブルーチンを使用して、変数の内容をテキストファイルに書き込みます。(writetoFileサブルーチンには、パスや既存のファイル検証など、さらにいくつかの機能が含まれています。)

    writeToFile("$filename.tmp","$path",$list);

  4. 追加のファイルを作成して前の手順で作成したファイルのテキストを処理し、処理したコンテンツをそこに保存します(次に、最初の一時ファイルを削除します)。

私が疑問に思うのは、$list変数内で直接テキストをファイルに保存する前に処理を実行できるかどうかです。プロセス全体は期待どおりに機能していますが、その背後にあるロジックはあまり好きではなく、同じファイルを複数回書き換える必要があるため、少し非効率的です。

編集: 変数の内容を処理するときに私が実際に何を求めているかについてもう少し情報を提供するためだけに。したがって、この場合にWebサイトから取得するデータは、実際には空白行で区切られたアイテムのリストであり、最初の行は私には関係ありません。したがって、このデータの処理中に私が行っているのは2つのことです。

  1. 空の(CRLF)行を削除します
  2. 特定のテキストが含まれている場合は、最初の行を削除します。

理想的には、途中で追加のファイルを作成せずに、処理されたリスト(空白スペースと最初の行が削除されていない)をファイルに保存したいと思います。ファイルを保存するために、writeToFileサブ(私が書いた)を使用します。これは、そのようなファイルがすでに存在するかどうかの検証も実行するためです(ファイルが最終処理の前に保存される場合、writeToFileは常に既存のファイルを書き換えます)。

それが理にかなっていることを願っています。

4

1 に答える 1

1

あなたはスプリットを探しています。パターンは異なります:(?<=\n)改行文字でsplitを使用し、それを保持します。それが問題ではない場合は\R、あらゆる種類の改行を含めるために使用します。

foreach my $line (split qr/\R/, $mech->content) {
    …
}

現在、必須のHTML-parsing-with-regexの警告:Mechanizeを使用してHTMLソースを取得する場合、行ごとに解析することはあまり意味がありません。代わりに、HTMLを取り除いたバージョンのドキュメントを処理するか、HTMLソースをWeb :: Querytextなどのパーサーに渡して、必要な部分を宣言的に取得することをお勧めします。

于 2013-03-24T17:27:55.923 に答える