【问题标题】:How to obtain contents of multiple HTML tags using grep?如何使用 grep 获取多个 HTML 标签的内容?
【发布时间】:2019-05-02 11:32:56
【问题描述】:

我正在尝试使用 bash 脚本从网页返回歌曲名称和艺术家。

在查阅了一些 SO 帖子后,我整理了一下:

#!/bin/sh

metadata=$(curl -s marci277.marci.io |
  grep -oP '(?<=<p class="title"> ).*?(?= </div>)')

echo $metadata

但是,它只是返回一个空白的空行。

这是此时网页中的相关代码:

<div class="clearfix" id="block1" style="display:block;min-height:114px;width:100%;background:#ffff00;border-top:0px solid #000;border-bottom:0px solid #000;">
    <div id="letterbox1" class="letterboxThumbnail base" data-artist="Tom Robinson" data-title="Listen To The Radio" data-album="" data-thumbBGColor="ffffff" >
        <img src="img/artists/cache/mThumb_Tom Robinson.jpg" alt="Tom Robinson" width="104" height="104" style="border:1px solid #ffffff;" class="thumbnail" />
    </div>
    <p class="time">6:22 am  CST</p>
    <p class="title">Listen To The Radio</p>
    <p class="artist">Tom Robinson</p>
</div>
<p class="verticalSpacer"></p>

只有倒数第三和第二节课对我有用。

我还在某处读到这种 grep 技术可能不适用于非 div(在这种情况下,它是一个 p 标签)。如果是这样,我该如何解析这些标签的属性?

【问题讨论】:

  • 不要使用正则表达式来解析html或xml,而是使用一些specific tool

标签: html bash grep


【解决方案1】:

我同意,如果你真的想解析 xml/html,你应该使用像 xpath 这样的工具,如本文所述:bash XHTML parsing using xpath


解决问题的替代方法:

我查看了您发布的代码和marci277.marci.io 的源代码。页面中嵌入了一个 ajax 函数,可以准确地提供您正在寻找的内容。见var xhr = $.ajax({...之后的代码

您可以使用以下 URL 访问它:http://marci277.marci.io/ajaxRequester.php?s=marci277

它提供了由- 分隔的艺术家和标题,因此在您的 shell 脚本中解析它类似于:

#!/bin/sh
metadata=$(curl -s http://marci277.marci.io/ajaxRequester.php?s=marci277)
artist="$(echo $metadata | awk 'BEGIN {FS=" - "} {print $1}')"
title="$(echo $metadata | awk 'BEGIN {FS=" - "} {print $2}')"

echo "Artist: $artist"
echo "Title: $title"

也许这会让你的事情变得更容易。

【讨论】:

    【解决方案2】:

    sed 解决方案。

    metadata="$(curl -s marci277.marci.io)"    
    artist="$(sed -n 's@.*class="artist">\([^<]\+\).*@\1@p' <<< $metadata)"
    title="$(sed -n 's@.*class="title">\([^<]\+\).*@\1@p' <<< $metadata)"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-08-09
      • 1970-01-01
      • 1970-01-01
      • 2012-02-15
      • 2011-11-26
      • 2017-02-24
      • 1970-01-01
      • 2015-02-08
      相关资源
      最近更新 更多