如何使用grep获取多个HTML标签的内容?

时间:2019-05-02 11:32:56

标签: html bash grep

我正在尝试使用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>

对我来说,只有第3和最后2个班级有用。

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

2 个答案:

答案 0 :(得分: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"

也许这会让您更轻松。

答案 1 :(得分:1)

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