Скрипт синтаксического анализа в узле js с использованием node-html-парсера

#node.js #parsing

Вопрос:

Я создаю сценарий, используя node.js и мне нужно разобрать скрипт внутри веб-сайта, точно мне нужно 2 части, а не только весь скрипт. 2 части-это «акции» и «местные» и их значения.

 <script id="z-vegas-pdp-props" type="application/json">


![CDATA[{
            "layout": "cover",
            "model": {
                "layout": "cover",
                "priceInfo": {
                    "showPriceHint": false,
                    "priceHintType": ""
                },
            "mediaInfo": {
                "currentIndex": 0
            },
                    
            "price": {
                "currency": "EUR",
                "value": 129.99,
                "formatted": "129,99 €"
            },
            "originalPrice": {
                "currency": "EUR",
                "value": 129.99,
                "formatted": "129,99 €"
            },
            "available": false,
            "stock": 0
        }
        //here the scripts continues but i "trimmed it to make it more easy"
    </script>
 

Это то, что я сделал, но это разбор всего кода, а не только тех частей, которые мне нужны.

 let root = HTMLParser.parse(response.body);
    let availabiltyDiv = root.querySelector("#z-vegas-pdp-props")
    console.log(availabiltyDiv)
 

Ответ №1:

Данные, которые вы ищете, скрываются в формате json CDATA внутри сценария. Поэтому сначала вам нужно извлечь строку json, проанализировать ее и перейти к целевым данным. Кстати, образец строки json в вашем вопросе искажен, но, по-видимому, хорошо сформирован в реальном сценарии. Кроме того, local в вашем образце их нет, поэтому я вместо этого использую другое значение.

В целом:

 const jstring = availabiltyDiv.childNodes[0].nodeValue.split('CDATA[')[1].split(']')[0]
const target = JSON.parse(jstring);

#to get to (for example) price and stock:
const price = target.model.price.formatted;
const stock = target.model.stock;

console.log(price,stock)
 

Выход:

 "129,99 €" 0
 

Редактировать:

Как указано в ответе на ваш комментарий, у меня нет доступа к вашему фактическому availabilityDiv , но вы также можете попробовать заменить

 const jstring = availabiltyDiv.childNodes[0].nodeValue.split('CDATA[')[1].split(']')[0]
 

с

 const jstring = availabiltyDiv.innerHTML.split('CDATA[')[1].split(']')[0]
 

или с

 const jstring = availabiltyDiv.innerText.split('CDATA[')[1].split(']')[0]
 

и посмотрим, сработают ли они.

Комментарии:

1. я получаю эту ошибку: Не удается прочитать свойство «разделение» неопределенного в… как я могу это исправить?

2. @DennyVidotto Как я уже сказал, json в вашем вопросе искажен, и мне пришлось его исправить, чтобы получить ответ. Чтобы иметь возможность сделать это с реальным <script> контентом, вам придется опубликовать его целиком availabilityDiv , что, вероятно, слишком долго. Вы также можете попробовать предложения в правке в ответе.

3. когда я их заменяю, я получаю: синтаксическую ошибку: Неожиданный конец ввода JSON, кстати, когда я регистрирую доступность, я получаю это, если это будет полезно: <ref *1> HTMLElement { Родительский элемент: HTMLElement { Родительский элемент: [HTMLElement], дочерние узлы: [Массив], Тип узла: 1, rawTagName: ‘x-обертка-pdp’,}, Дочерние узлы: [[HTMLElement], [Круговой *1], [HTMLElement]], rawAttrs:», Тип узла: 1, имя узла: ‘div’, //дополнительные строки Дочерние коды: [TextNode { Родительский код: [Круговой *1], дочерние коды: [], тип узла: 3, _rawText: ‘<ссылка *1> [CDATA[{«макет»:»обложка»,»модель»:{«макет»: //продолжайте