我在从特定网页上抓取日期时遇到困难,因为日期显然是传递给javascript函数的参数。我过去曾写过几个简单的刮刀,没有任何重大问题所以我没想到会出现问题,但我正在努力解决这个问题。该页面有常规yyyy / mm / dd格式的5-6个日期,例如dateFormat('2012/02/07')
理想情况下,我想删除除了六个日期之外的所有内容,我希望将其保存在数组中。在这一点上,我甚至无法成功获得一个约会,更不用说所有这些约会了。它可能只是一个格式错误的正则表达式,我一直在寻找它,以至于我再也找不到了。
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
答案 0 :(得分:3)
为什么你的模式中有两个空白字符?
$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
修饰符让您的模式搜索字符串中的所有匹配项。