批量-从 html 文档中获取文件的 url

批量-从 html 文档中获取文件的 url

我想使用 curl 下载最新版本的这个文件。但是,该网站有一个 robots.txt,我认为这就是阻止我使用curl -L -z WorldGuard.zip http://www.curse.com/server-mods/minecraft/worldguard/download它来获取它的原因。http://addons.curse.cursecdn.com/files/684/741/worldguard-5.7.3.zip页面的 html 源代码中有一个指向该文件的直接链接,我使用此链接来卷曲它,因为这个链接不是永久链接,所以我需要找到一种方法从第一个链接(它是永久链接)获取此 url。

如果我使用,curl -L http://www.curse.com/server-mods/minecraft/worldguard/download我最终会得到作为输出。我尝试使用FOR /F "skip=628 tokens=10,11,12,13,14 delims=/ " %%a in ('curl -L http://www.curse.com/server-mods/minecraft/worldguard/download') DO curl -z foo.zip %%a'),但似乎可以跳过的行数有限制(类似于 31 的标记限制),并且它可能还会给我之后的所有行(这不是我想要的)。

接下来,我尝试将输出保存到文本文件并删除除我想要的行之外的所有行,但是,我不知道如何删除不包含特定字符串的行。我原本想只关注包含特定字符串的行"http://addons.curse.cursecdn.com/files/"(换句话说,包含我想要的 url 的行),但我不知道该怎么做。

我怎样才能仅获取 url(或更改的部分:)684/741/worldguard-5.7.3.zip,然后让 curl 下载它?

编辑:如果没有简单的方法在批处理脚本和/或使用 curl 执行此操作,我愿意接受其他替代方案。我愿意接受使用 Visual Basic (.vbs.)、PowerShell 或任何可以从批处理文件执行的答案(几乎所有内容都应该如此)。我仍然更喜欢使用批处理和 curl 来保持一致并在一个文件中,因为我已经在批处理中拥有了 90% 的我想要的内容。另外,我对非批处理的东西不太熟悉,所以如果您能解释一下脚本的作用,我会更满意。

答案1

以下命令将在 .htm 文件中查找包含下载链接的行,并使用一种快速而粗略的方法从该行中提取 URL。这种方法不是很可靠,但只要“如果您的下载未开始,请单击此处”行使用的 html 没有发生重大变化,它应该可以工作。

for /F "tokens=4 delims==" %i in ('findstr download-link source.htm') do 
    @set match=%i
set zipurl=%match:~1,-7%
echo %zipurl%|findstr /R ^http://.*\.zip$

属性 'class="download-link"' 公开了链接到 .zip 文件的标签。使用等号作为分隔符,第四个标记将是"http://addons.[...].zip" class。为了摆脱周围的引号和单词 'class', 的子字符串%match%存储在 中%zipurl%。第三行是可选的,但可用于检查脚本是否仍然有效。%errorlevel%如果提取的 URL 以 'http://' 开头并以 '.zip' 结尾,则 Findstr 设置为零,否则将其设置为一。

若要在批处理文件中使用,请替换%i%%i

答案2

...但是,我不知道如何删除不包含特定字符串的行...

删除以下行不要包含特定字符串,请参阅此帖子 正则表达式匹配不包含单词的字符串

帖子中有更多信息,并提供了各种其他答案,但这个答案的基础是:

你可以使用sedgrep(或者sedfind)来过滤文件的行。

  1. 搜索/替换整个文件,在包含以下内容的每一行开头添加唯一的“标签”任何文本。
  2. 对于包含目标字符串,从行首删除唯一的“标签”。
  3. 此时,所有以唯一“Tag”开头的行,不要包含目标字符串。现在您可以delete(或者只对这些行执行“其他操作”)。

答案3

你可以使用以下方法以更少的步骤完成此操作sedgrep,但这里有一个仅使用内置命令的解决方案。

@echo off

rem    edit next line to include your filename    
set "zzfilename=captured-page.html"

rem    get the target line
type "%zzfilename%"|find /i "data-href"|find /i ".zip">"zztarget.txt"
for /f "usebackq delims=" %%f in (`type "zztarget.txt"`) do set zzaaa=%%f

rem    change double-quotes to single-quotes
set "zzaaa1=%zzaaa:"='%"

rem    remove unneeded text from the beginning of the line
set "zzaaa2=%zzaaa1:*data-href=gotit%"

rem    remove the "<" and ">" characters
set "zzaaa3=%zzaaa2:<='%"
set "zzaaa4=%zzaaa3:>='%"

rem    from what remains, take only the desired URL
for /f "usebackq tokens=2 delims='" %%f in (`echo %zzaaa4%`) do set "zzgotit=%%f"

rem    show the work and cleanup
set zz
set "zzaaa="
set "zzaaa1="
set "zzaaa2="
set "zzaaa3="
set "zzaaa4="
del "zztarget.txt">nul 2>&1

完整的 URL 将包含在变量中zzgotit

相关内容