我的HTML内容如下:
<html>
<head><title>Index </title></head>
<body bgcolor="white">
<h1>Index of /Test/</h1><hr><pre><a href="../">../</a>
<a href="1.0/">1.0/</a> 17-Mar-2018 17:36 -
<a href="1.1/">1.1/</a> 19-Jun-2018 19:22 -
<a href="1.2/">1.2/</a> 22-Sep-2018 00:18 -
<a href="documents/">documents/</a> 25-Apr-2018 23:40 -
<a href="samples">samples</a> 03-Sep-2018 16:00 403699
</pre><hr></body>
</html>
我通过向服务器发出请求来获得上述HTML输出。
从HTML输出中,我希望最终输出如下:
1.0
1.1
1.2
documents
samples
如何使用bash脚本获取上述输出?
答案 0 :(得分:0)
使用正则表达式解析HTML或XML文件实际上是not done。 sed
和awk
之类的工具在处理文本文件方面非常强大,但是当归结为解析复杂结构的数据(例如XML,HTML,JSON等)时,它们仅是其一而已而不是大锤。是的,您可以完成工作,但有时要付出巨大的代价。为了处理这些精美的文件,您需要使用更有针对性的工具集来提高技巧。
如果解析XML或HTML,则可以轻松使用xmlstarlet
。
如果是XHTML文件,则可以使用:
xmlstarlet sel --html -N "x=http://www.w3.org/1999/xhtml" \
-t -m '//x:a' -v . -n
其中-N
给出XHTML命名空间(如果有的话),它由
<html xmlns="http://www.w3.org/1999/xhtml">
但是,由于HTML页面通常不是格式正确的XML,因此使用tidy
对其进行清理可能很方便。在上面的示例中,这给出了:
$ tidy -q -numeric -asxhtml --show-warnings no <file.html> \
| xmlstarlet sel --html -N "x=http://www.w3.org/1999/xhtml" \
-t -m '//x:a' -v . -n
../
1.0/
1.1/
1.2/
documents/
samples
答案 1 :(得分:0)
使用https://www.w3.org/Tools/HTML-XML-utils中的HTML-XML-utils:
$ hxnormalize -x infile.html | hxselect -c -s '\n' a
../
1.0/
1.1/
1.2/
documents/
samples
由于流氓hxnormalize
标签,<hr>
步骤是必需的(hxselect
需要格式正确的输入); -x
选项代表“使用XML约定”。
hxselect a
步骤提取所有锚元素; -c
选项仅打印内容,而-s '\n'
用换行符分隔结果。
如果您确实不希望结尾的/
,可以通过管道传输到tr -d '/'
。