bash - 从包含多个链接的 html 文件中提取文件名

CLo*_*Los 4 grep bash text-processing regular-expression html

我已经下载了一个由网页上的脚本自动生成的 html 文件。该文件包含多个链接,包括指向我试图提取图像全名的图像的链接,例如

<a href="000000.jpg" title="image name.jpg" target="_blank">Image name.jpg</a>
Run Code Online (Sandbox Code Playgroud)

从上面我想"Image name.jpg"存储在一个文件中。由于有数百个,我解析文件并存储每个名称,因为它出现以下命令:

grep -i -E -o "target=\"_blank\">([[:graph:]]*)\.(jpg|png|gif|webm)" "$thread" | cut -f 2 -d '>' | sed 's/ /_/g' - > "$names"
Run Code Online (Sandbox Code Playgroud)

其中“ $thread”是html文件的名称,“ $names”是作为输出的文件名列表。我使用“ cut”删除'target="_blank">'部分,然后将空格转换为下划线。

由于文件中还有其他几个链接,我指定了要抓取的扩展名(图像和 webm)。其他一切都应该被忽略。我已经到了它只抓取这些链接的地步,但是它错过了一些。

某些文件包含空格和非字母数字字符。如果我使用[[:print:]]which 应该涵盖所有这些情况,我将一无所获,或者我得到了一些<head>html 部分而什么也没有。如果我使用[[:graph:][:space:]],我也一无所获。如果我只是使用[[:graph:]](如上),或者[[:alnum:][:punct:]]我可以获得带有字母数字/其他字符(如“ filenamewith(parenthesis).jpg”)但不是空格的文件,反之亦然,[[:alnum:][:space:]]可以使用但省略其他可打印字符(“ file name with spaces.jpg”可以使用,但不能“与(括号、逗号或其他.jpg”)。

据说[[:print:]]涵盖了所有情况,但我没有得到我需要的,如果我理解正确的话,

grep -E -o应该只匹配(根据上述情况): *.jpg *.png *.gif*.webm

我试过grep有和没有-E/-o/-e不同的变化。

有任何想法吗?我正在使用 Arch Linux、grep 2.20、bash 4.3.18

gle*_*man 6

最好的策略是使用一个合适的 html 解析器,它可以输出所有<a>标签的值。

这里,xmlstarlet特别是一个 XML 解析器,您的 HTML 可能不是格式良好的 XML,但您可能会明白:

echo '<html>
<a href="000000.jpg" title="image name.jpg" target="_blank">Image name.jpg</a>
</html>' | xmlstarlet sel -t -v //a
Run Code Online (Sandbox Code Playgroud)
Image name.jpg
Run Code Online (Sandbox Code Playgroud)