Bash - чтение HTML и поиск div на основе двух разных переменных - PullRequest
0 голосов
/ 08 сентября 2018

Я пытаюсь получить информацию из div на основе даты, которую я держу в качестве переменной, затем я пытаюсь отфильтровать возвращенные результаты на основе другой переменной, чтобы сузить список результатов до одного совпадения, чтобы извлечь URL.

Пример HTML страницы, в ней будет еще 10 элементов с различной информацией. Одна и та же дата может появляться более одного раза.

<div class="bhangra-artist details ">

    <div class="bhangra-artist card">
        <div class="bhangra-artist-title" style="text-overflow: none;">
        <a href="/bhangra/artist/album/id/123456/title-of-the-album/" data-trackid="title of the album" title="Title Of The Album" style="position: relative; left: 0px;">
            Title Of The Album            </a>
        </div>

        <div class="artist-names">
            <a href="/bhangra/artist/profile/id/1234/artist-name/" data-trackid="Artist Name goes here" title="Artist Name">Artist Name</a>                            </div>


        <time>
            September 08, 2018            </time>

        <div class="release-information">
                                <a class="date-of-release" href="releases-today" data-trackid="releases today" title="releases today">
                    <span class="label-left-box">releases today</span>
                    <span class="label-text">releases today</span>
                </a>
                            <span class="label-hd "></span>
        </div>
    </div>

В моем сценарии я бегу

DATE=$(cat html.txt | sed -n -e '/bhangra-artist card/,/<\/time>/ p'  )
echo "${DATE}"

Это возвращает ниже, но все результаты, так что их около 10 совпадений вернулось. Я просто показываю пример 3.

    <div class="bhangra-artist card">
        <div class="bhangra-artist-title" style="text-overflow: none;">
        <a href="/bhangra/artist/album/id/123456/title-of-the-album/" data-trackid="title of the album" title="Title Of The Album" style="position: relative; left: 0px;">
            Title Of The Album            </a>
        </div>

        <div class="artist-names">
            <a href="/bhangra/artist/profile/id/1234/artist-name/" data-trackid="Artist Name goes here" title="Artist Name">Artist Name</a>                            </div>


        <time>
            September 08, 2018            </time>
    <div class="bhangra-artist card">
        <div class="bhangra-artist-title" style="text-overflow: none;">
        <a href="/bhangra/artist/album/id/123456/title-of-the-album/" data-trackid="title of the album" title="Title Of The Album" style="position: relative; left: 0px;">
            Title Of The Album            </a>
        </div>

        <div class="artist-names">
            <a href="/bhangra/artist/profile/id/1234/artist-name/" data-trackid="Name Artist goes here" title="Name Artist">Name Artist</a>                            </div>


        <time>
            September 08, 2018            </time>
    <div class="bhangra-artist card">
        <div class="bhangra-artist-title" style="text-overflow: none;">
        <a href="/bhangra/artist/album/id/123456/title-of-the-album/" data-trackid="title of the album" title="Title Of The Album" style="position: relative; left: 0px;">
            Title Of The Album            </a>
        </div>

        <div class="artist-names">
            <a href="/bhangra/artist/profile/id/1234/artist-name/" data-trackid="Artist1 Name & Artist2 Name" title="Artist1 Name & Artist2 Name">Artist1 Name & Artist2 Name</a>                            </div>


        <time>
            September 05, 2018            </time>

С возвращенными результатами я сейчас пытаюсь сузить их до одного результата. У меня есть переменная с именем $ ReleaseDate, которая будет иметь значение 08 сентября 2018 Так что теперь, когда у $ {DATE} есть 10 различных div с датами, мне нужно сопоставить все те, которые содержат дату в $ ReleaseDate. Это часть, в которой я не уверен, как это сделать.

Я ожидаю, что результаты будут сужены до переменной даты, поэтому в приведенном выше примере я бы ожидал, что 3 результата снизятся до 2 результатов.

    <div class="bhangra-artist card">
        <div class="bhangra-artist-title" style="text-overflow: none;">
        <a href="/bhangra/artist/album/id/123456/title-of-the-album/" data-trackid="title of the album" title="Title Of The Album" style="position: relative; left: 0px;">
            Title Of The Album            </a>
        </div>

        <div class="artist-names">
            <a href="/bhangra/artist/profile/id/1234/artist-name/" data-trackid="Artist Name goes here" title="Artist Name">Artist Name</a>                            </div>


        <time>
            September 08, 2018            </time>
    <div class="bhangra-artist card">
        <div class="bhangra-artist-title" style="text-overflow: none;">
        <a href="/bhangra/artist/album/id/123456/title-of-the-album/" data-trackid="title of the album" title="Title Of The Album" style="position: relative; left: 0px;">
            Title Of The Album            </a>
        </div>

        <div class="artist-names">
            <a href="/bhangra/artist/profile/id/1234/artist-name/" data-trackid="Name Artist goes here" title="Name Artist">Name Artist</a>                            </div>


        <time>
            September 08, 2018            </time>

Как только я сузил результаты от 10 до результатов, соответствующих моей переменной даты, у них останется 1-3 результата. Так что теперь мне нужно отфильтровать это до 1 результата.

У меня есть окончательная переменная $ artistName. К сожалению, она содержит «Имя исполнителя Имя альбома», поэтому я просто сопоставляю первое слово, которое всегда будет именем исполнителя.

Поэтому я хочу сопоставить $ artistName со строкой «Имя исполнителя», как только это будет сделано, я хочу удалить содержащийся div и все остальные div, чтобы у меня остался один результат.

    <div class="bhangra-artist card">
        <div class="bhangra-artist-title" style="text-overflow: none;">
        <a href="/bhangra/artist/album/id/123456/title-of-the-album/" data-trackid="title of the album" title="Title Of The Album" style="position: relative; left: 0px;">
            Title Of The Album            </a>
        </div>

        <div class="artist-names">
            <a href="/bhangra/artist/profile/id/1234/artist-name/" data-trackid="Artist Name goes here" title="Artist Name">Artist Name</a>                            </div>


        <time>
            September 08, 2018            </time>

Раз у меня только один результат. Я пытаюсь получить ссылку на этот альбом. Я полагаю, что уже могу нацелиться на это, но я сопоставляю его с html, поэтому все экземпляры, поскольку я не могу отфильтровать div на основе имеющихся у меня переменных.

        <a href="/bhangra/artist/album/id/123456/title-of-the-album/" data-trackid="title of the album" title="Title Of The Album" style="position: relative; left: 0px;">
            Title Of The Album            </a>

Конечный результат: / bhangra / исполнитель / альбом / id / 123456 / название альбома /

У меня есть определенные элементы, но я полностью застрял в том, как собрать все это вместе.

Итак, резюмируем: -

Мои переменные и значения: -

$DATE=September 08, 2018
$artistName=Artist Name Name Of The Album

Код, который у меня есть.

#!/bin/bash

echo "date : ${DATE}" #This has the value September 08, 2018
echo "artist: ${artistName}" #This has the value Artist Name Name Of The Album
# Get HTML and find the DIV's containing the information that is required.
# GetContainer Reads the html file html.txt, using sed to target the entire bhangra artist panel until the time section. This returns 10 results.
GetContainer=$(cat html.txt | sed -n -e '/bhangra-artist details/,/<\/time>/ p' )
IFS=$OIFS
# Run GetContainer into another variable called filterDATE and now search this for a date retain the containing div and remove all other results. This step should take the results down from 10 results to only a handful 1-3 usually. 
As the the date match would only return 1-3 results in total.
filterDATE=$(echo -n "$GetContainer" )
filterDATE=$(echo -n "$filterDATE" ) #Unsure how to do this so this step is blank as I am unsure how to verify the selected date against my variable $DATE and the get all of the outer div.

# Now that I only have 1-3 results I want to narrow this down to one result. 
Using $artistName retain the containing div and remove all other results. This step would mean that I should now only be left with 1 result.

# Once I have narrowed down the results to 1 strip away html so that only the link is remaining. I guess at this point I need to use the results from filterDATE but for now I am checking I can pull back the link from the raw html.
GETURL=$(cat html.txt | sed -n -e '/bhangra-artist-title/,/<\/a>/ p' | grep "bhangra" | sed 's/<a href=\"//g' | sed 's/"//g' )

echo "${DATE}"
echo "${filterDATE}"
echo "${GETURL}"

Любая помощь будет оценена.

...