【发布时间】:2012-02-29 21:24:57
【问题描述】:
我遇到了另一个与我要抓取的网站有关的问题。
基本上,我已经从页面内容中删除了大部分我不想要的内容,并且感谢here 提供的一些帮助,我设法隔离了我想要的日期。尽管一些初始问题与非破坏空间相匹配,但其中大部分似乎工作正常。但是,我现在对最终的正则表达式有困难,该正则表达式旨在将每行数据拆分为字段。每条线代表股价指数的价格。每行的字段是:
- 任意长度的名称,由拉丁字母表中的字符组成,有时是逗号或 & 符号,没有数字。
- 小数点后两位数(索引的绝对值)。
- 小数点后两位数(值的变化)。
- 小数点后有两位数字后跟百分号(值的百分比变化)的数字。
这是一个示例字符串,在拆分之前: "渔业、农业和林业243.45-1.91-0.78% 采矿360.74-4.15-1.14% 建筑465.36-1.01-0.22% 食品783.2511.281.46% 纺织品和服装412.070.540.13% 纸浆和造纸333.31-0.29 -0.09% 化学品729.406.010.83% "
我用来分割这一行的正则表达式是这样的:
$mystr =~ s/\n(.*?)(\d{1,4}\.\d{2})(\-?\d{1,3}\.\d{2})(.*?%)\n/\n$1 == $2 == $3 == $4\n/ig;
它有时有效,但有时无效,我不知道为什么会这样。 (下面示例输出中的双等号用于使字段拆分更容易可见。)
Fishery, Agriculture & Forestry == 243.45 == -1.91 == -0.78%
Mining360.74-4.15-1.14%
Construction == 465.36 == -1.01 == -0.22%
Foods783.2511.281.46%
我认为对于那些指数价格出现负变化的指数来说,减号是个问题,但有时尽管有减号,它仍然有效。
问。为什么下面显示的最终正则表达式无法一致地拆分字段?
示例代码如下。
#!/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);
# get dates:
(my @dates) = $content =~ /(?<=dateFormat\(')\d{4}\/\d{2}\/\d{2}(?='\))/g;
foreach my $date (@dates) { # convert to yyyy-mm-dd
$date =~ s/\//-/ig;
}
my $tree = HTML::Tree->new();
$tree->parse($content);
my $mystr = $tree->as_text;
$mystr =~ s/\xA0//gi; # remove non-breaking spaces
# remove first chunk of text:
$mystr =~
s/^(TSE.*?)IndustryIndexChange ?/IndustryIndexChange\n$dates[0]\n\n/gi;
$mystr =~ s/IndustryIndexChange ?/IndustryIndexChange/ig;
$mystr =~ s/IndustryIndexChange/Industry Index Change\n/ig;
$mystr =~ s/% /%\n/gi; # percent symbol is market for end of line
# indicate breaks between days:
$mystr =~ s/Stock.*?IndustryIndexChange/\nDAY DELIMITER\n/gi;
$mystr =~ s/Exemption from Liability.*$//g; # remove boilerplate at bottom
# and here's the problem regex...
# try to split it:
$mystr =~
s/\n(.*?)(\d{1,4}\.\d{2})(\-?\d{1,3}\.\d{2})(.*?%)\n/\n$1 == $2 == $3 == $4\n/ig;
print $mystr;
【问题讨论】:
-
我假设数字列从它们之间的某些东西开始。但是当我们提取它们时,所有的数字都被挤在一起了,只有(希望)固定的格式来帮助我们把它们分开。如果你把分隔符留在里面,事情会不会容易很多?
-
公平点。这些数字最初位于 5 个不同的表格中,因此要么尝试解析/保存每个表格,要么使用 HTML::Tree 转储文本,我选择了后者。由于这些领域非常规则,我不认为这会是一个问题,理论上我仍然认为这不应该是一个问题。然而,在实践中......
标签: regex perl web-scraping lwp html-tree