javascript — можно ли использовать XPath для поиска в & lt; script & gt; блок?

У меня все в порядке в выборе всех видов HTML-контента. Поэтому, уверенно создавая некоторый код, который должен копировать содержимое сайта, я наткнулся на какой-то странный код JavaScript, в который источник помещает свои цены.

<script>
var productConfig = {"attributes":{"178":{"id":"178","code":"bp_flavour","label":"Smaak","options":[{"id":"28","label":"Aardbeien","oldPrice":"0","products":["2292","2294","2296","2702"]}

…. больше тарабарщины и более 4-х вариантов каждого продукта: (например, 80 разных строк, как это 🙂

,"childProducts":{
"2292":"price":"64.99","finalPrice":"64.99","no_of_servings":"166","178":"27","179":"34"},
"2292":"price":"17.99","finalPrice":"17.99","no_of_servings":"33","178":"28","179":"25"}
}


</script>

По-видимому, 2292 является идентификатором продукта под рукой. Я хотел бы зачитать «FinalPrice».

Мой код PHP:

    $file = $this->curl_get_file_contents($url);
$doc = new DOMDocument();
@$doc->loadHTML($file);
$doc->preserveWhiteSpace = false;
$finder = new DomXPath($doc);

$price_query = $finder->query("//script[contains(.,'finalPrice')]");
$price_raw = $price_query->item(0)->nodeValue;

Однако мой запрос //script[contains(.,"finalPrice")] взрывает весь сценарий, я не могу найти способ копать глубже и более конкретно в JavaScript. Кто-нибудь знает больше / может дать мне подсказку?

0

Решение

Вы можете попробовать регулярное выражение:

preg_match_all("/finalPrice\\":\\"([0-9.]{1,10})\\"/", $page_html, $output_array);
0

Другие решения

Вы можете прочитать свойства из объекта, как это.

var obj = {"2292":{"price":"64.99","finalPrice":"64.99","no_of_servings":"166","178":"27","179":"34"}};
obj['2292']['finalPrice']
0

Итак, что я сделал: зачитал скрипт с предоставленным запросом XPATH. Than: strstr, пока я не получу нужные мне части Следующим шагом было: PHP-функция json_decode. Помещает его в массив, чем искал в массивах то, что я хотел. Это мой код для разбора:

        $price_query = $finder->query("//script[contains(.,'finalPrice')]");
$price_raw = $price_query->item(0)->nodeValue;
$price_1 = strstr($price_raw, "childProducts");
$price_2 = str_replace('childProducts":', '', $price_1);
$price_3 = strstr($price_2, ',"priceFromLabel"', true);
$price_data = json_decode($price_3, true);

Похоже на хрень с str str, но работает. Спасибо всем за ваши мысли. json_decode ftw!

0
По вопросам рекламы [email protected]