0
for ($i=0; $i<10; $i++)
{
  my $v1 = $sel->get_text("//body[\@id='ext-gen3']/div[10]/div[2]/div/div/div/div/div/div/div/div/div/div[2]/div/**div**/table/tbody/tr/td/div/div");

my $v2 = $sel->get_text("//body[@\id='ext-gen3']/div[10]/div[2]/div/div/div/div/div/div/div/div/div/div[2]/div/**div**/table/tbody/tr/td[2]/div/div")

print ($v1 . $v2);
}

对于每次迭代,它必须找到从第 14 个元素开始div[10]并用增加的div[ ]元素替换它(例如:如果第 14 个元素是div,则将其替换为div[2]。在下一次迭代中找到第 14 个元素,即div[2]& 将其替换为div[3]& 依此类推)。

通过使用 PATTERN 匹配,它不能。有没有使用正则表达式查找特定元素并替换它的方法?我该怎么做 ?

 my $a = "//body[\@id='ext-gen3']/div[10]/div[2]/div/div/div/div/div/div/div/div/div/div[2]/div/**div**/table/tbody/tr/td/div/div"; 
    my @arr = split ('/' , $a); 
    print "@arr \n"; 
    my $size1 = @arr; 
    print "$size1\n"; 
    print $arr[16]; 
    foreach my $a2 (@arr) 
    { 
    print "$a2 \n"; 
    }
my $b = "//body[\@id='ext-gen3']/div[10]/div[2]/div/div/div/div/div/div/div/div/div/div[2]/div/**div**/table/tbody/tr/td[2]/div/div";

上述问题中提到的两个变量为 v1 和 v2(编辑为 $a 和 $b),修改必须同时适用于它们。我想我几乎接近你所说的。你能帮我进一步吗

4

2 回答 2

1
use 5.010;
my $xpath = q(//body[@id='ext-gen3']/div[10]/div[2]/div/div/div/div/div/div/div/div/div/div[2]/div/div/table/tbody/tr/td/div/div);

for my $i (0..10) {
    my @nodes = split qr'/', $xpath;
    $nodes[16] .= "[$i]" unless 0 == $i;
    say join '/', @nodes;
}

结果:

//body[@id='ext-gen3']/div[10]/div[2]/div/div/div/div/div/div/div/div/div/div[2]/div/div/table/tbody/tr/td/div/div
//body[@id='ext-gen3']/div[10]/div[2]/div/div/div/div/div/div/div/div/div/div[2]/div/div[1]/table/tbody/tr/td/div/div
//body[@id='ext-gen3']/div[10]/div[2]/div/div/div/div/div/div/div/div/div/div[2]/div/div[2]/table/tbody/tr/td/div/div
//body[@id='ext-gen3']/div[10]/div[2]/div/div/div/div/div/div/div/div/div/div[2]/div/div[3]/table/tbody/tr/td/div/div
//body[@id='ext-gen3']/div[10]/div[2]/div/div/div/div/div/div/div/div/div/div[2]/div/div[4]/table/tbody/tr/td/div/div
//body[@id='ext-gen3']/div[10]/div[2]/div/div/div/div/div/div/div/div/div/div[2]/div/div[5]/table/tbody/tr/td/div/div
//body[@id='ext-gen3']/div[10]/div[2]/div/div/div/div/div/div/div/div/div/div[2]/div/div[6]/table/tbody/tr/td/div/div
//body[@id='ext-gen3']/div[10]/div[2]/div/div/div/div/div/div/div/div/div/div[2]/div/div[7]/table/tbody/tr/td/div/div
//body[@id='ext-gen3']/div[10]/div[2]/div/div/div/div/div/div/div/div/div/div[2]/div/div[8]/table/tbody/tr/td/div/div
//body[@id='ext-gen3']/div[10]/div[2]/div/div/div/div/div/div/div/div/div/div[2]/div/div[9]/table/tbody/tr/td/div/div
//body[@id='ext-gen3']/div[10]/div[2]/div/div/div/div/div/div/div/div/div/div[2]/div/div[10]/table/tbody/tr/td/div/div
于 2012-06-26T12:07:17.683 回答
-1

嗯,所有元素都用/分隔,对吧?所以可以使用原生的 split 方法,根据 / 来拆分 div[10] 后面的部分文本。将其存储在数组$arr中。合并它以查找字符串的长度,例如$len。找到div[10]的索引,比如$orig_index。然后找到第 14 个元素,进行正则表达式匹配以查看它的格式:

$arr[13] =~ /div([\d+])?/;
if ($1) {
  $arr[13] =~ /div[$1]/div[($1+1)]/e;
      }
else {
   $arr[13] = div[2];
   }

现在第 14 个元素已更改,连接数组以从 div[10] 和第 14 个之间的部分获取新的输出字符串:

{
local $" = ''; 
$newstring = "@arr";
}
splice($originalstring,$orig_index,$len,$newstring);

我认为会这样做。

于 2012-06-26T07:39:28.743 回答