代码之家  ›  专栏  ›  技术社区  ›  Galet

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

  •  -3
  • Galet  · 技术社区  · 6 年前

    我的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
    

    2 回复  |  直到 6 年前
        1
  •  0
  •   kvantour    6 年前

    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">
    

    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
    
        2
  •  0
  •   Benjamin W.    6 年前

    使用来自 https://www.w3.org/Tools/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 '/' .