我曾经使用以下命令来获取网页的所有链接,然后获取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
方法突然停止工作。
警告:在大多数情况下(如果不是全部)使用正则表达式解析 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)
笔记:
curl -Ls URL | grep -oP 'href="\K[^"]+'
Run Code Online (Sandbox Code Playgroud)
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,除非您知道自己在做什么或需求非常有限(例如:只需要链接),就像在本例中一样。