2015-11-06 61 views
0

我发现了一种通过我找到的Perl脚本从图像链接中提取替换文本的方法。但是,该方法需要下载目标HTML;通过Perl脚本处理它,然后生成一个带有我需要的特定alt文本的文本文件;然后删除一些额外的文本,我不能通过代码手动过滤出来,因为我不知道如何使用Perl的正则表达式工作(我试图安装PCRE无济于事)。使用JavaScript书签从图像链接中提取替代文本

这种方法仍然不切实际,我敢肯定,我可以通过JavaScript书签提取更多更快的alt文本,并且可以立即将输出整齐地列入新选项卡中。但是,我不知道如何将Perl脚本转换为JavaScript,也不知道如何从头开始编写。

这里的Perl脚本:

{ 
    # Get data from HTML file 
    my $From = cwd() . '/' . $ARGV[0]; 
    open(HTMLFILE, '<' . $From) or die("Cannot open $From to read."); 

    my $Html; 
    read HTMLFILE, $Html, -s $From; 
    close HTMLFILE; 

    # Find IMG elements 
    print "Images found!"; 
    my %AltTexts; 
    while ($Html =~ /(<IMG\b.*?>)/isg) { 
     my $ImgElement = $1; 

     # Find SRC tag 
     $ImgElement =~ /SRC\s*=\s*([\"\'])(.*?)\1/is; 
     my $Src = $2; 

     # Find ALT tag & store text 
     if ($ImgElement =~ /ALT\s*=\s*([\"\'])(.*?)\1/is) { 
      $AltTexts{$Src} = $2; 
     } 
     else { # No ALT found so give it default text if none already found 
      unless (exists($AltTexts{$Src})) { 
       $AltTexts{$Src} = 'NO_ALT_TEXT'; 
      } 
     } 
    } 

    # Write extracted data to a file 
    my $To = cwd() . '/' . $ARGV[0] . '.txt'; 
    open(ALTTEXTFILE, '>' . $To) or die("Cannot open $To to write."); 

    foreach my $SrcPath (sort keys %AltTexts) { 
     print ALTTEXTFILE "$AltTexts{$SrcPath}\n"; 
    } 
    close ALTTEXTFILE; 
} 

我并调整它从打印链接,删除空行等

原文可以发现停止脚本here

所以,我的问题是提取替代文字的JavaScript是什么样的?

回答

2

像这样:

javascript:(function() { 
    var imgs = document.images,alts=[]; 
    for (var i=0;i<imgs.length;i++) { 
     alts.push(imgs[i].getAttribute("alt") || "no alt"); 
    } 
    alert(alts.join("\n")); 
})() 

示例代码:

(function() { 
 
    var imgs = document.images,alts=[]; 
 
    for (var i=0;i<imgs.length;i++) { 
 
    alts.push(imgs[i].getAttribute("alt") || "no alt"); 
 
    } 
 
    console.log(alts); 
 
})()
<img alt="alt1" /> 
 
<img alt="" /> 
 
<img alt="alt2" />

要在新的窗口显示(弹出窗口阻止允许)

javascript:(function() { 
    var imgs = document.images,alts=[],w; 
    for (var i=0;i<imgs.length;i++) { 
    alts.push(imgs[i].getAttribute("alt") || "no alt"); 
    } 
    if (alts.length>0) { 
    w = window.open("","_blank"); 
    if (w) { 
     w.document.write(alts.join("<br />")); 
     w.document.close(); 
    } 
    else { 
     alert("cannot pop\n"+alts.join("\n")); 
    } 
    } 
})() 

次为了避免重复:

变化

alts.push(imgs[i].getAttribute("alt") || "no alt"); 

var alt = imgs[i].getAttribute("alt"); 
if (alts && alts.indexOf(alt)==-1) alts.push(alt); 
+0

这是伟大的。任何方式使输出显示在单独的浏览器选项卡而不是对话框? – lestrange

+0

查看更新 - 未测试,因为这里的沙箱不允许它 – mplungjan

+0

这太棒了!谢谢你,先生。 – lestrange