如何使用bash脚本从HTML响应中的锚标记获取文本

时间:2018-09-05 09:44:45

标签: bash awk sed grep html-parsing

我的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脚本获取上述输出?

2 个答案:

答案 0 :(得分:0)

使用正则表达式解析HTML或XML文件实际上是not donesedawk之类的工具在处理文本文件方面非常强大,但是当归结为解析复杂结构的数据(例如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 '/'