#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[{«макет»:»обложка»,»модель»:{«макет»: //продолжайте