【问题标题】:Extracting alt text from image links with a JavaScript bookmarklet使用 JavaScript 小书签从图像链接中提取替代文本
【发布时间】:2015-11-06 12:59:13
【问题描述】:

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

这种方法仍然不切实际,而且我确信我可以通过 JavaScript 小书签更快地提取替代文本,并立即将输出整齐地列在新选项卡中。但是,我不知道如何将我拥有的 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找到

那么,我的问题是用于提取 alt 文本的 JavaScript 是什么样的?

【问题讨论】:

    标签: javascript html regex perl alt


    【解决方案1】:

    像这样:

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

    【讨论】:

    • 这很棒。有什么方法可以让输出显示在单独的浏览器选项卡而不是对话框中?
    • 查看更新 - 未测试,因为这里的沙箱不允许这样做
    • 这太棒了!谢谢你,先生。
    • 不客气。只是为了让您知道您的问题实际上与help center 中所见的主题无关,但我喜欢书签:)
    • 与 perl 一样,我无法避免重复的 alt 文本显示在结果中(例如,joey 页面中的 ' 页面)。有没有办法从输出中删除整个重复的短语?
    猜你喜欢
    • 2012-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多