LINUX.ORG.RU

Первые попытки парсинга HTML со встроенным JSON из JavaScript: что пошло не так?

 


0

1

Страница https://lyrics.lyricfind.com/lyrics/procol-harum-a-whiter-shade-of-pale включает в себя JSON в теге

<script id="__NEXT_DATA__" type="application/json">

Структура JSON такая:

{
  "props": {
    "pageProps": {
      "songData": {
        "response": {
          "code": 101,
          "description": "SUCCESS: LICENSE, LYRICS"
        },
        "track": {
          "lfid": "002-881192",
          "language": "en",
          "rovi": "MT0000108280",
          "gracenote": "GN0K05NH2AB4K0M",
          "apple": 1440671809,
          "deezer": 18167615,
          "spotify": "03x2itbo74uxfsrokh27ff",
          "isrcs": [
            "ES5621904215"

          ],
          "instrumental": false,
          "viewable": true,
          "has_lrc": false,
          "has_contentfilter": true,
          "has_emotion": true,
          "has_sentiment": true,
          "title": "A Whiter Shade of Pale",
          "artists": [
            {
              "name": "Procol Harum",
              "lfid": "lf:22747",
              "slug": "procol-harum",
              "is_primary": true
            }
          ],
          "artist": {
            "name": "Procol Harum"
          },
          "last_update": "2023-01-01 00:00:00",
          "lyrics": "We skipped the light fandango...

Из консоли Chrome пробую извлечь lyrics:

// извлечь JSON из HTML-DOM
let rawJSON = document.getElementById("__NEXT_DATA__").textContent;
console.log(rawJSON); // получается успешно

// получить многомерный массив с JSON-деревом
let objJSON = JSON.parse(rawJSON);
console.log(objJSON); // получается успешно

// получить текст из элемента
let lyrics = objJSON.props.pageProps.songData.track.lyrics;
console.log(lyrics);

На последнем шаге получаю ошибку:

ncaught TypeError: Cannot read properties of undefined (reading 'track') at <anonymous>:5:47

Что здесь не так?

★★★★★

Я вот бухой, но глянул исходную страницу и то, что ты привел в примере непверно. Ты пропустил «response» -

objJSON.props.pageProps.songData.response.track.lyrics;

Но может я тоже промахнулся. Только такие вопросы я не понимаю зачем задавать.

pi11 ★★★★★
()
Ответ на: комментарий от pi11

Нет, track вложен в songData (на одном уровне с reponse), а не в response.

eugrus ★★★★★
() автор топика
Ответ на: комментарий от Nervous

Попробовал в Firefox и действительно всё работает. Какие-то странности Хрома.

eugrus ★★★★★
() автор топика

Все работает в хромиуме. Скорее всего где-то нет songData

dicos ★★★
()

Так в консоли хрома и введи

objJSON.props.pageProps.songData.track.lyrics
Он тебе покажет, какие ключи там есть, каких нет, что мозги сношаешь.

crutch_master ★★★★★
()

Вводи поочереди, objJSON.props, objJSON.props.pageProps и смотри где сломается и чего не хватает.

kardapoltsev ★★★★★
()

songData

Ну либо его таки нет, либо спеллинг другой (какие-то буквы не латинские, а из похожего юникода)

no-such-file ★★★★★
()

посмотрите другие свойства кроме textContent, может там есть content или innerText или сразу что-нибудь про джейсон

Syncro ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.