我正在编写一个 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 的问题(这是浏览器工作的重要组成部分)。其他语言例如perl
或python
具有用于解析 HTML 以提取 URL 的良好库模块。对于 shell 脚本,请使用lynx
.
man lynx
详情请参阅。
lynx
几乎肯定可以为您的 Linux 发行版或其他类 UNIX 操作系统预先打包。如果没有,您可以从上面的链接获取源代码。