我想从 HTML 页面中提取链接来下载图片,我有几千个这样的 HTML 文件。我该怎么做?

我想从 HTML 页面中提取链接来下载图片,我有几千个这样的 HTML 文件。我该怎么做?

所以我有 HTML 文件,其中包含我想要提取的特定部分。这些 HTML 地址位于一个文本文件中。从此文本文件中获取的示例 HTML 网页将如下所示,我想要获取部分 009514HB.JPG,每个 HTML 文件都不同。

我的 .txt 文件大概是这样的 -

    https://www.dermquest.com/image-library/image/5044bfd0c97267166cd653c8
https://www.dermquest.com/image-library/image/5044bfcfc97267166cd61ff4
https://www.dermquest.com/image-library/image/5044bfd0c97267166cd6310a
https://www.dermquest.com/image-library/image/5044bfd0c97267166cd6310b
https://www.dermquest.com/image-library/image/5044bfcfc97267166cd61ff5
https://www.dermquest.com/image-library/image/5044bfd0c97267166cd64278
https://www.dermquest.com/image-library/image/5044bfcfc97267166cd61ff6
https://www.dermquest.com/image-library/image/5044bfcfc97267166cd61ff7
https://www.dermquest.com/image-library/image/5044bfd0c97267166cd63c1b
https://www.dermquest.com/image-library/image/5044bfcfc97267166cd619b1
https://www.dermquest.com/image-library/image/5044bfcfc97267166cd619b4
https://www.dermquest.com/image-library/image/5044bfcfc97267166cd625a3
https://www.dermquest.com/image-library/image/5044bfd0c97267166cd64844
https://www.dermquest.com/image-library/image/5044bfcfc97267166cd619ba
https://www.dermquest.com/image-library/image/5044bfd0c97267166cd63ce3
https://www.dermquest.com/image-library/image/5044bfd0c97267166cd64437
https://www.dermquest.com/image-library/image/5044bfd1c97267166cd67203

如果我使用文本编辑器单击打开其中一个 html 页面,我就能找到我需要的信息。

   *** some code here***
<figure>
         <a href="/imagelibrary/large/009514HB.JPG" target="_blank" class="preview-image"><img src="/imagelibrary/medium/009514HB.JPG" alt="acne keloidalis nuchae"/></a>
</figure>
...

现在我想从各种 HTML 文件中获取这些数字,然后将这些数字附加到https://www.dermquest.com/imagelibrary/large。例如,我希望我的最终 txt 文件具有这样的 URL,[略微 NSFW]https://www.dermquest.com/imagelibrary/large/009514HB.JPG这行对我来说更容易获取图像!我对 SED 或 AWK 了解不多,所以任何建议/帮助都很好。

谢谢!

tl;dr:链接指向的是网页而不是图像,所以当我使用 wget 时,我下载的是 html 页面而不是我想要的图像。我认为我可以这样做,但任何更好的解决方案也会有所帮助!

答案1

根据输入文件的复杂程度,我建议不要尝试使用 等来解析 HTML awkgrep而是使用 HTML 解析器。对于类似的任务,我使用山猫文本模式浏览器。要安装它,一个简单的sudo apt install lynx就足够了。然后:

for file in *.html; do
    lynx -dump -listonly -nonumbers $file >> links.txt
done

对于您的示例代码片段,它会创建以下输出:

file:///imagelibrary/large/009514HB.JPG

完成后,file://需要用适当的基本 URL 替换该部分:

sed -i 's|file://|https://www.dermquest.com|' links.txt

结果:

https://www.dermquest.com/imagelibrary/large/009514HB.JPG

答案2

将其分解成几个步骤,您需要:

  1. 处理一堆文件(名为*.html?)。
  2. 提取类似的行<a href="/imagelibrary/large/009514HB.JPG" ...
  3. 提取文件名部分(“ 009514HB.JPG”)
  4. 使用文件名部分生成文本。

    find . -type f -name '*.html' -print0 | \
        xargs -0 -r grep --no-filename "a href=" | \
        grep -E -o '[0-9A-Z]+\.JPG'
    

然后,通过将上述内容包装在for $()构造中,我们得到:

for i in $( find . -type f -name '*.html' -print0 | \
    xargs -0 -r grep --no-filename "a href=" | \
    grep -E -o '[0-9A-Z]+\.JPG'
          ) ; do
    echo "https://www.dermquest.com/imagelibrary/large/$i"
done

当然,阅读man find,,man xargsman grep

相关内容