为了获得 Oracle Java 教程的离线版本,其中所有 Java API 链接均应指向已下载的 Java API 文档的本地版本,我使用以下 wget 命令(如果尝试,请注意:获取超过 25,000 个文件):
wget -mkp -nH -nv -E --accept-regex ".*javase/8/docs/api.*|.*javase/tutorial.*" http://docs.oracle.com/javase/8/
不幸的是,只有一部分链接被转换为正确指向本地文件。下面的所有文件javase/tutorial
都很好,但是从那里指向下载的 API 文件的所有文件都javase/8/docs/api
不会指向此本地文件,而是仍然指向在线版本。
任何想法有什么问题吗?
––––
1 我知道有一个可下载版本的教程,但它的 API 链接仅指向在线 Java API 文档。
答案1
看来您发现了一个错误wget
。我尝试了几次命令迭代wget
,试图找出原因。我的第一个想法是正则表达式将wget
其视为两个不相交的集合,并且不在它们之间进行链接。我制定了一个非正则表达式版本来获取看似相同的文件,将选项转换为长形式并使它们离散(--mirror 是复合的)并添加到日志文件中并保留原始文件:
wget --recursive --convert-links --backup-converted --page-requisites --no-host-directories --level=inf --adjust-extension --include /javase/tutorial,/javase/tutorialJWS,/javase/8/docs/api https://docs.oracle.com/javase/8/index.html 2>&1 | tee wget.log
对文件进行比较,我发现它出现在每个链接中不是转换后的内容是原始来源中的绝对链接。所有最初的相对链接都保持相对(没有真正转换)。输出声称wget
已经“转换”了相关文件,但似乎只有非锚定标签被触及。
--include
在将一些链接设置为绝对链接(包括图像)后,我在我控制的站点上使用了相同的选项和等效参数。并得到相同的结果:只有具有绝对地址的非锚标记被转换,绝对锚不受影响。
对于您的项目的规模来说,即使使用脚本,将链接转换为相对链接的前景似乎也令人畏惧。我发现了 PerlMonk 帖子将 HTML 文件中的绝对链接更改为相对链接使用针对您现在面临的问题的 perl 脚本。
我还没有测试过它,但它有一个选项可以制作备份副本作为安全网,所以值得一试。
同时,我想您有幸报告wget
.仅供参考,我的版本是:
$ wget --version
GNU Wget 1.14 built on linux-gnu.
+digest +https +ipv6 +iri +large-file +nls +ntlm +opie +ssl/openssl
Wgetrc:
/etc/wgetrc (system)
Locale: /usr/share/locale
Compile: gcc -DHAVE_CONFIG_H -DSYSTEM_WGETRC="/etc/wgetrc"
-DLOCALEDIR="/usr/share/locale" -I. -I../lib -I../lib
-fmessage-length=0 -grecord-gcc-switches -O2 -Wall
-D_FORTIFY_SOURCE=2 -fstack-protector -funwind-tables
-fasynchronous-unwind-tables -g
Link: gcc -fmessage-length=0 -grecord-gcc-switches -O2 -Wall
-D_FORTIFY_SOURCE=2 -fstack-protector -funwind-tables
-fasynchronous-unwind-tables -g -lproxy /usr/lib64/libssl.so
/usr/lib64/libcrypto.so /usr/lib64/libz.so -ldl -lz -lz -lidn
ftp-opie.o openssl.o http-ntlm.o ../lib/libgnu.a