Как получить содержимое нескольких тегов HTML с помощью grep? - PullRequest
0 голосов
/ 02 мая 2019

Я пытаюсь вернуть название песни и исполнителя с веб-страницы, используя скрипт 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 (в данном случае это тег ap).Если это так, как я могу проанализировать эти теги для их атрибутов?

Ответы [ 2 ]

1 голос
/ 02 мая 2019

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)"
1 голос
/ 02 мая 2019

Я могу согласиться, если вы действительно хотите разобрать xml / html, вы должны использовать инструмент, подобный xpath, как описано в этом посте: парсинг XHTML bash с использованием xpath


Альтернативный способ решения вашей проблемы:

Я посмотрел код, который вы разместили, и исходный код marci277.marci.io. На странице встроена функция ajax, которая точно обеспечивает то, что вы ищете. См. Код после var xhr = $.ajax({...

Вы можете получить к нему доступ, используя следующий URL: http://marci277.marci.io/ajaxRequester.php?s=marci277

Он предоставляет исполнителя и название, разделенные -, поэтому анализ этого в вашем сценарии оболочки будет выглядеть примерно так:

#!/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"

Может быть, это облегчит вам жизнь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...