我正在尝试使用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标记)。如果是这样,我如何解析这些标签的属性?
答案 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)"