2012-06-26 229 views
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]取代它在未来iterartion找到14元即div[2] &替换为div[3] &等)。如何用另一个div []元素替换一个div []元素?

通过使用PATTERN匹配,它不能。有没有什么方法通过使用正则表达式来找到替代它的特定元素&?我该怎么做 ?如在上面提到的问题,因为V1 V2 &

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"; 

两个变量(编辑为$ a和$ b)中,修改已申请它们两者。我想我已经接近你所说的了。可以同时请帮我进一步

回答

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 
-1

嗯,所有的元素都分开/,对吧?因此,您可以使用本地拆分方法根据/分割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); 

我认为那样做。

+0

@ Cupidvogel:什么是在if语句的意思是$ 1吗? –

+0

哦,你需要详细研究Perl的正则表达式。 ** 1美元**是成功比赛时用括号括起来的第一组。因此,如果元素是** div [5] **,那么$ 1将是5. – SexyBeast

+0

请将代码格式化为正确的答案,您编写的代码几乎不可读。 – SexyBeast

相关问题