修复不完整链接数组

修复不完整链接数组

我正在编写一个 bash 脚本,它将在页面中查找链接。它从页面下载源代码并在其中查找链接A标签并将它们存储到数组中,$链接。但问题是某些链接不会包含整个 URL,而仅包含子页面或文件。假设页面的源代码如下所示:

<h1>Julian's crappy webpage</h1>
<a href="http://one.com">Page One</a>
<a href="https://two.com">Page Two</a>
<a href="/three">Page Three</a>
<a href="four">Page Four</a>

找到链接后,数组将如下所示:

http://one.com
https://two.com
/three
four

我也有一个变量$网址这是一个有效的 URL,例如“https://google.com

我需要一种方法来制作所有物品$链接根据该项目做不同的事情是有效的。对于中的每一项$链接:

  • 如果该项目以 / 开头,则合并:$网址+${链接[n]}
  • 如果该项目不以“/”或“https://”或“http://”开头,则组合:$网址+“/”+${链接[n]}

例如上面的预期响应:

http://one.com
https://two.com
https://google.com/three
https://google.com/four

答案1

这是一个示例脚本,您可以使用它来实现此目的:

#!/bin/bash

shopt -s extglob
readonly URL="https://google.com"
links=($(grep -o -P '(?<=href=").*(?=")' source.html)) # read into array

for ((i=0; i<${#links[@]}; i++))
do
  case ${links[$i]} in
    http*)
      : # do nothing
      ;;
    /*)  
      links[$i]="$URL"${links[$i]}; # update array
      ;; 
    *)
      links[$i]="$URL/"${links[$i]}; # update array
      ;;
  esac
done

它假设source.html是当前目录中网页的下载源。

答案2

使用正则表达式解析 HTML 的方法有无数种出错。即使对于看似简单的任务(例如从 HTML 文件中提取 URL)也是如此。

因此,不要使用正则表达式。使用类似这样的东西:

#! /bin/bash

htmlfile='./file.html'
URL='https://google.com'

links=($(lynx -dump -listonly -nonumbers -force_html "$htmlfile" | 
         sed -e "s=^file://=$URL="))

printf "%s\n" "${links[@]}"

这需要山猫被安装。 lynx是一个基于 ncurses 的文本模式 Web 浏览器。这里使用它只是在 HTML 文件中生成链接列表,因为lynx已经解决了比你想象的要困难得多如何可靠地在 HTML 内容中查找 URL 的问题(这是浏览器工作的重要组成部分)。其他语言例如perlpython具有用于解析 HTML 以提取 URL 的良好库模块。对于 shell 脚本,请使用lynx.

man lynx详情请参阅。

lynx几乎肯定可以为您的 Linux 发行版或其他类 UNIX 操作系统预先打包。如果没有,您可以从上面的链接获取源代码。

相关内容