所以我有 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 awk
,grep
而是使用 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
将其分解成几个步骤,您需要:
- 处理一堆文件(名为
*.html
?)。 - 提取类似的行
<a href="/imagelibrary/large/009514HB.JPG" ...
。 - 提取文件名部分(“
009514HB.JPG
”) 使用文件名部分生成文本。
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 xargs
。man grep