Как получить href из этого ответа? - PullRequest
0 голосов
/ 03 июля 2019

У меня есть код, в котором я получаю ответ первого потомка класса div, и я хочу получить 993307 из моей переменной first. Как я могу это сделать?

<a href="https://osu.ppy.sh/beatmapsets/993307/discussion#/1050967" title="MIIRO (TV Size) - AKINO from bless4 (mapped by Sotarks)">
const cheerio = require('cheerio');
const rp = require('request-promise');

var array = [];

rp(`https://osu.ppy.sh/beatmapsets/events?user=&types%5B%5D=disqualify&min_date=&max_date=`)
  .then((html) => {
    let $ = cheerio.load(html);
    $('div#events.beatmapset-events').each(function(i, element) {
      var first = $(this).children().eq(1);
      console.log(first.html())
    })
  })
  .catch(console.error.bind(console));

ответ от first переменная

<div class="beatmapset-event">
  <a href="https://osu.ppy.sh/beatmapsets/993307/discussion#/1050967" title="
                   MIIRO (TV Size) - AKINO from bless4
                   (mapped by Sotarks)
               ">
    <img class="beatmapset-activities__beatmapset-cover" src="https://assets.ppy.sh/beatmaps/993307/covers/list.jpg?1562167122" srcset="https://assets.ppy.sh/beatmaps/993307/covers/list.jpg?156216712
2 1x, https://assets.ppy.sh/beatmaps/993307/covers/list@2x.jpg?1562167122 2x">
  </a>
  <div class="beatmapset-event__icon beatmapset-event__icon--disqualify beatmapset-activities__event-icon-spacer"></div>
  <div>
    <div class="beatmapset-event__content">
      Disqualified by <a class="user-name js-usercard" data-user-id="3388410" href="https://osu.ppy.sh/users/3388410" style="color: #6B3FA0">eiri-</a>. Reason: <a href="https://osu.ppy.sh/beatmapsets/9
93307/discussion#/1050967">#1050967</a> ([no preview]).
    </div>
    <div><time class="timeago" datetime="2019-07-03T15:17:20+00:00">July 3, 2019 at 3:17:20 PM UTC</time></div>
  </div>
</div>

Ответы [ 2 ]

0 голосов
/ 03 июля 2019

Предполагая, что ваш ответ является строкой.Используйте DomParser()

let response = '<div class="beatmapset-event"> <a href="https://osu.ppy.sh/beatmapsets/993307/discussion#/1050967" title=" MIIRO (TV Size) - AKINO from bless4 (mapped by Sotarks) "> <img class="beatmapset-activities__beatmapset-cover" src="https://assets.ppy.sh/beatmaps/993307/covers/list.jpg?1562167122" srcset="https://assets.ppy.sh/beatmaps/993307/covers/list.jpg?156216712 2 1x, https://assets.ppy.sh/beatmaps/993307/covers/list@2x.jpg?1562167122 2x"> </a><div class="beatmapset-event__icon beatmapset-event__icon--disqualify beatmapset-activities__event-icon-spacer"></div><div><div class="beatmapset-event__content"> Disqualified by <a class="user-name js-usercard" data-user-id="3388410" href="https://osu.ppy.sh/users/3388410" style="color: #6B3FA0">eiri-</a>. Reason: <a href="https://osu.ppy.sh/beatmapsets/9 93307/discussion#/1050967">#1050967</a> ([no preview]).</div><div><time class="timeago" datetime="2019-07-03T15:17:20+00:00">July 3, 2019 at 3:17:20 PM UTC</time></div></div></div>'
var parser = new DOMParser(); // initiate DomParser()
var data = parser.parseFromString(response, 'text/html'); 
let atagLink = data.querySelector("a").getAttribute("href") // get the a tag's href attribute
console.log(atagLink.match(/(\d+)/)[0]) // match with regex

Детали регулярного выражения : (\d+) Соответствует вхождению первого числа.

То, что делает ваш код

rp(`https://osu.ppy.sh/beatmapsets/events?user=&types%5B%5D=disqualify&min_date=&max_date=`)
  .then((html) => {
    let $ = cheerio.load(html);
    var parser = new DOMParser(); // initiate DomParser()
    var data = parser.parseFromString(html, 'text/html'); 
    let atagLink = data.querySelector("a").getAttribute("href") // get the a tag's href attribute
    let number = atagLink.match(/(\d+)/)[0]
    $('div#events.beatmapset-events').each(function(i, element) {
      var first = $(this).children().eq(1);
      console.log(first.html())
    })
  })
0 голосов
/ 03 июля 2019

Это то, что вы ищете?

var href = $(first).find('a').first().attr('href');
var matches = href.match(/\/(\d+)\//);

if (matches[1]) {
    console.log(matches[1]);
}
...