gpt4 book ai didi

python - 在静态网站中本地检查死链接(使用 wget?)

转载 作者:太空狗 更新时间:2023-10-29 17:32:37 26 4
gpt4 key购买 nike

检查死链接(例如指向 404 错误的链接)的一个非常好的工具是 wget --spider .但是,我有一个稍微不同的用例,我生成一个静态网站,并想在上传之前检查是否有损坏的链接。更准确地说,我想检查两者:

  • 相关链接如<a href="some/file.pdf">file.pdf</a>

  • 绝对链接,最有可能指向外部站点,如 <a href="http://example.com">example</a> .

我试过了 wget --spyder --force-html -i file-to-check.html ,读取本地文件,将其视为 HTML 并跟踪每个链接。不幸的是,它无法处理本地 HTML 文件中的相关链接(错误 Cannot resolve incomplete link some/file.pdf )。我尝试使用 file://但是wget不支持。

目前,我有一个基于运行本地网络服务器的技巧 python3 http.serve并通过 HTTP 检查本地文件:

python3 -m http.server &
pid=$!
sleep .5
error=0
wget --spider -nd -nv -H -r -l 1 http://localhost:8000/index.html || error=$?
kill $pid
wait $pid
exit $error

出于以下几个原因,我对此不是很满意:

  • 我需要这个 sleep .5等待网络服务器准备就绪。没有它,脚本会失败,但我不能保证 0.5 秒就足够了。我更希望有一种方法来启动 wget服务器准备就绪时的命令。

  • 相反,这 kill $pid感觉很丑。

理想情况下,python3 -m http.server可以选择在服务器准备就绪时运行命令,并在命令完成后自行关闭。这听起来通过编写一些 Python 是可行的,但我想知道是否存在更简洁的解决方案。

我错过了什么吗?有更好的解决方案吗?我说的是 wget在我的问题中,因为它几乎可以满足我的要求,但使用 wget对我来说不是必需的(也不是 python -m http.server )。我只需要有一些易于在 Linux 上运行和自动化的东西。

最佳答案

所以我认为您的方向是正确的。我会使用 wgetpython,因为它们是许多系统上两个现成的选项。好的部分是它可以为您完成工作。现在您想要的是从该进程的 stdout 监听 Serving HTTP on 0.0.0.0

所以我会使用类似下面的东西开始这个过程

python3 -u -m http.server > ./myserver.log &

请注意我在这里使用的-u 用于无缓冲输出,这非常重要

现在等待此文本出现在 myserver.log

timeout 10 awk '/Serving HTTP on 0.0.0.0/{print; exit}' <(tail -f ./myserver.log)

所以 10 秒是您在这里的最长等待时间。休息是不言自明的。接下来是关于您的 kill $pid。我认为这不是问题,但如果您希望它更像用户的操作方式,那么我会将其更改为

kill -s SIGINT $pid

这相当于您在启动程序后处理CTRL+C。此外,我还会使用类似下面的内容处理 SIGINT 我的 bash 脚本

https://unix.stackexchange.com/questions/313644/execute-command-or-function-when-sigint-or-sigterm-is-send-to-the-parent-script/313648

上面基本上是在 bash 脚本的顶部添加 below 来处理你使用 CTRL+C 或外部终止信号终止脚本

#!/bin/bash
exit_script() {
echo "Printing something special!"
echo "Maybe executing other commands!"
trap - SIGINT SIGTERM # clear the trap
kill -- -$$ # Sends SIGTERM to child/sub processes
}

trap exit_script SIGINT SIGTERM

关于python - 在静态网站中本地检查死链接(使用 wget?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49278135/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com