任何体面的编程/脚本语言都可以做到这一点,你知道任何编程语言吗?
这是一个使用 PHP 的示例:
<?php
$domd=@DOMDocument::loadHTMLFile("export.xml");
foreach($domd->getElementsByTagName("img") as $img){
$src=$img->getAttribute("src");
if(empty($src)){
continue;
}
$path=parse_url($src,PHP_URL_PATH);
if(!is_dir('.'.dirname($path)))
mkdir('.'.dirname($path).'/', 0777, TRUE);
file_put_contents('.'.$path,file_get_contents($src));
}
您标记的所有工具都无法自行执行此操作(尽管 wget 的镜像功能已接近,但您需要一个 Web 服务器首先将其提供给 wget。一个聪明的 grep 正则表达式也可以接近,但大约就像用正则表达式解析 html 一样有问题)
(另请注意,上面的代码没有针对内存使用进行优化,它会将整个文件放入内存中,然后再将其刷新到磁盘,所以如果你有 4GB 内存,并且没有交换,并尝试下载一个 5GB 的图像方式,你会遇到 OOM 崩溃。可以通过 fread/fwrite 循环轻松缓解)
编辑:如果您在 php 中有 allow_url_fopen=Off,则可以使用以下函数替换 file_get_contents:
function curl_get_contents(string $url): string {
try {
$ch = curl_init ();
if (! $ch) {
throw new \RuntimeException ( 'curl_init failed!' );
}
if (! curl_setopt_array ( $ch, array (
CURLOPT_URL => $url,
CURLOPT_ENCODING => '',
CURLOPT_RETURNTRANSFER => true
) )) {
throw new \RuntimeException ( 'curl_setopt_array failed! errno: ' . curl_errno ( $ch ) . ". error: " . curl_error ( $ch ) );
}
$ret = curl_exec ( $ch );
if (! is_string ( $ret )) {
throw new \RuntimeException ( 'curl_exec failed! errno: ' . curl_errno ( $ch ) . ". error: " . curl_error ( $ch ) );
}
return $ret;
} finally{
curl_close ( $ch );
}
}
(通过你的cmets,你有这个问题)