2

日付は明らかにjavascript関数に渡される引数であるため、特定のWebページから日付を取得するのに問題があります。私は過去に大きな問題のないいくつかの簡単なスクレーパーを書いたので、問題は予想していませんでしたが、これに苦労しています。このページには、このdateFormat( '2012/02/07')のような通常のyyyy / mm / dd形式の5〜6の日付があります

理想的には、配列に保存したい半ダースの日付を除くすべてを削除したいと思います。現時点では、すべての日付は言うまでもなく、1つの日付を取得することすらできません。おそらく、私がこれ以上見つけることができないほど長い間それを探していたのは、単なる不正な正規表現です。

Q1。以下の正規表現と一致しないのはなぜですか?

Q2。上記の質問に続いて、どのようにしてすべての日付を配列にスクレイプできますか?ページ上の日付をx個と想定し、ループをx回実行し、キャプチャしたグループをループごとに配列に割り当てることを考えていましたが、それはかなり不格好なようです。

問題コードは次のとおりです。

#!/usr/bin/perl -w
use strict;
use LWP::Simple;
use HTML::Tree;

my $url_full = "http://www.tse.or.jp/english/market/STATISTICS/e06_past.html";
my $content = get($url_full);
#dateFormat('2012/02/07');
$content =~ s/.*dateFormat\('(\d{4}\/\d{2}\/\d{2}\s{2})'\);.*/$1/; # get any date without regard to greediness etc
4

1 に答える 1

3

パターンに2つの空白文字があるのはなぜですか?

$content =~ s/.*dateFormat\('(\d{4}\/\d{2}\/\d{2}\s{2})'\);.*/$1/;
                                                 ^^^^^

それらはあなたのフォーマット例にはありません'dateFormat(' 2012/02/07')'

これがあなたのパターンが一致しない理由だと思います。

すべての日付をキャプチャする

このような配列にすべての一致を簡単に取得できます

( my @Result ) = $content =~ /(?<=dateFormat\(')\d{4}\/\d{2}\/\d{2}(?='\))/g;

(?<=dateFormat\(')dateFormat\('日付パターンの前にあることを保証する前向きな後読みアサーションです(ただし、これは一致に含まれていません)

(?='\))'\)パターンの後にあることを保証する前向きな先読みアサーションです

修飾子を使用gすると、パターンで文字列内のすべての一致を検索できます。

于 2012-02-08T08:56:04.760 に答える