curl 获取网页的所有链接

Zei*_*zar 7 curl links

我曾经使用以下命令来获取网页的所有链接,然后获取grep我想要的内容:

curl $URL 2>&1 | grep -o -E 'href="([^"#]+)"' | cut -d'"' -f2 | egrep $CMP-[0-9].[0-9].[0-9]$ | cut -d'-' -f3
Run Code Online (Sandbox Code Playgroud)

直到昨天为止都表现得很好。我尝试运行curl自身,然后看到它返回:

% Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                               Dload  Upload   Total   Spent    Left  Speed
0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
Run Code Online (Sandbox Code Playgroud)

是否有任何可能的更新导致命令不起作用或什么?

编辑1:

我改变了wget这个答案的看法:

wget -q $URL -O - | grep -o -E 'href="([^"#]+)"' | cut -d'"' -f2 | egrep $CMP-[0-9].[0-9].[0-9]$ | cut -d'-' -f3
Run Code Online (Sandbox Code Playgroud)

但仍然不知道为什么curl方法突然停止工作。

Nor*_*tfi 4

警告:在大多数情况下(如果不是全部)使用正则表达式解析 HTML是不好的,因此请自行决定是否继续。


这应该可以做到:

curl -f -L URL | grep -Eo "https?://\S+?\""
Run Code Online (Sandbox Code Playgroud)

或者

curl -f -L URL | grep -Eo '"(http|https)://[a-zA-Z0-9#~.*,/!?=+&_%:-]*"'
Run Code Online (Sandbox Code Playgroud)

笔记:

  • 这没有考虑到不“完整”的链接,或者基本上是我所说的“半链接”,其中仅显示完整链接的一部分。我不记得在哪里看到过这个,但它应该出现在某些网站上的某些/特定 HTML 标签下。 编辑:Gilles Quenot好心地为我错误地描述为“半链接”(正确的术语是相对链接)提供了一个解决方案:
curl -Ls URL |  grep -oP 'href="\K[^"]+'
Run Code Online (Sandbox Code Playgroud)
  • 这也不会“清理”不属于链接一部分的任何内容(例如:“&”字符等)。如果你想删除它,请制作/使用 sed 或其他类似的东西:
curl -f -L URL | grep -Eo "https?://\S+?\"" | sed 's/&.*//'
Run Code Online (Sandbox Code Playgroud)
  • 最后,这并没有考虑到链接显示的所有可能方式。因此需要一定的网页结构或 HTML 知识。鉴于您不能/不显示上述结构或网页本身的示例,很难做出适用于它的答案,除非涉及更多 HTML 知识。

  • PS:这可能很明显,也可能不明显,但这也没有考虑动态生成的链接/URL(例如:PHP、JS 等),因为curl 主要适用于静态链接。

  • PS(2):如果您想使用更好的方法来解析 HTML,您应该使用Gilles Quenot给出了更好的答案,它更适合一般(例如:完整)和更优化的 HTML 语法支持。

我绝不推荐使用正则表达式来解析 HTML,除非您知道自己在做什么或需求非常有限(例如:只需要链接),就像在本例中一样。