2014-10-20 2 views
0

Я проделал много HTML скрепок с использованием Xpath. Но теперь я должен очистить JSON и не знаю, как это сделать. Источник Я хочу, чтобы очистить это:соскабливание JSON с PHP

 { 
      "ASIN" : "B00DR4LYHY", 
      "FeatureName" : "price_feature_div", 
      "Type" : "JSON", 
      "Value" : 
      { 
       "content" : 
       {"price_feature_div":"<div id=\"price\" class=\"a-section a-spacing-small\">\n<table class=\"a-lineitem\">\n \n\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\n\n\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t \n\t\t\t\t \n\t\t\t\t \n\t\t\t\t \n\t\t\t\t \n\t\t\t\t \n\t\t\t\t  \n\t\t    \n\t\t       \n\t\t\t\t  \n\t\t    \n\t\t\t\t  \n\n\n\n\n\n\t\n<tr>\n <td class=\"a-color-secondary a-size-base a-text-right a-nowrap\">Price:<\/td>\n <td class=\"a-span12\">\n  <span id=\"priceblock_ourprice\" 

class=\"a-size-medium a-color-price\">$37.60<\/span>\n  \n\n\n\n  \n\n\n\n\n\n\n  \n\n  <span id=\"ourprice_shippingmessage\">\t\n  \t\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n \n  \n  \n  \n\n\t \n\t\t\n\t\t\n  \n   <span class=\"a-size-base a-color-base\">& <b>FREE Shipping<\/b><\/span>\n  \n  \n \n\n\n\n  <\/span>\n  \n  \n  \n  \n <\/td>\n<\/tr>\n\n\t\t\t\t \n\t\t\t\t \n\t\t\t\t \n\t\t\t\t \n\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\n\t\t   \n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\n\t\t\t\n\t\t\t\n\n\n\n\n\t\t\t\n\t\t\t\n\n\t\t\t\n\t\t\t\n\t\t\t\t\n\n\n\n\n\n\n\t\t\t\n\n\t\t\t\n\t\t\t\n\n\t\t\t\n\t\t\t\n\n\n\n\n\n\t\t\t\n\t\t\t\n\n\t\t\n\t\n\t\n\t\n\n \n \n\t\n<\/table>\n<\/div>"} 

     } 
    } 

Я получаю этот код из:

$URL = 'http://www.amazon.com/gp/twister/ajaxv2?sid=188-4344403-7969026&ptd=OUTERWEAR&json=1&dpxAjaxFlag=1&sCac=1&isUDPFlag=1&twisterView=glance&ee=2&pgid=apparel_display_on_website&sr=1-3&nodeID=1036592&rid=0Q05FXGQJSA20X44DJVG&parentAsin=B00DR4LUQY&enPre=1&qid=1413775191&dStr=size_name%2Ccolor_name&auiAjax=1&storeID=apparel&psc=1&asinList=B00DR4LYHY&isFlushing=2&id=B00DR4LYHY&prefetchParam=0&mType=full&dpEnvironment=softlines'; 

Что мне нужно, чтобы получить это цена ($ 37,60)

код, я использую, как указано в Венкате:

$URL = 'http://www.amazon.com/gp/twister/ajaxv2?sid=188-4344403-7969026&ptd=OUTERWEAR&json=1&dpxAjaxFlag=1&sCac=1&isUDPFlag=1&twisterView=glance&ee=2&pgid=apparel_display_on_website&sr=1-3&nodeID=1036592&rid=0Q05FXGQJSA20X44DJVG&parentAsin=B00DR4LUQY&enPre=1&qid=1413775191&dStr=size_name%2Ccolor_name&auiAjax=1&storeID=apparel&psc=1&asinList=B00DR4LYHY&isFlushing=2&id=B00DR4LYHY&prefetchParam=0&mType=full&dpEnvironment=softlines'; 



    $page = file_get_contents($URL); 
    $decoded = json_decode($page); 

    $html = $decoded->Value->content->price_feature_div; 


$dom = new DOMDocument(); 
$dom->loadHTML($html); 

$xpath = new DOMXPath($dom); 

//frem dom method 
$elements = $dom->getElementById("priceblock_ourprice")->item(0); 

//OR use extract it from xpath like below line 
$priceNode = $xpath->query("//*[@id='priceblock_ourprice']"); 

if (!is_null($elements)) { 
    //$priceNode = $elements->item(0); 
    $ourPrice = $priceNode; 
    echo $ourPrice; 
} 

Я думаю, что лучше всего использовать REGEX, но как должно выглядеть выражение?

+5

декодировать json, извлекать html, а затем кормить его в dom, как обычно. И нет, «лучший» будет ** НЕ ** быть регулярным выражением. –

+0

@MarcB спасибо, но вы можете объяснить, как это сделать? – Emilios1995

+0

http://php.net/json_decode –

ответ

0

Экстракция PHP

$json_string = '{"ASIN" : "B00DR4LYHY","FeatureName" : "price_feature_div","Type" : "JSON","Value" : {"content" : {"price_feature_div":"<div id=\"price\" class=\"a-section a-spacing-small\">\n<table class=\"a-lineitem\">\n \n\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\n\n\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t \n\t\t\t\t \n\t\t\t\t \n\t\t\t\t \n\t\t\t\t \n\t\t\t\t \n\t\t\t\t  \n\t\t    \n\t\t       \n\t\t\t\t  \n\t\t    \n\t\t\t\t  \n\n\n\n\n\n\t\n<tr>\n <td class=\"a-color-secondary a-size-base a-text-right a-nowrap\">Price:<\/td>\n <td class=\"a-span12\">\n  <span id=\"priceblock_ourprice\" class=\"a-size-medium a-color-price\">$37.60<\/span>\n  \n\n\n\n  \n\n\n\n\n\n\n  \n\n  <span id=\"ourprice_shippingmessage\">\t\n  \t\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n \n  \n  \n  \n\n\t \n\t\t\n\t\t\n  \n   <span class=\"a-size-base a-color-base\">& <b>FREE Shipping<\/b><\/span>\n  \n  \n \n\n\n\n  <\/span>\n  \n  \n  \n  \n <\/td>\n<\/tr>\n\n\t\t\t\t \n\t\t\t\t \n\t\t\t\t \n\t\t\t\t \n\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\n\t\t   \n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\n\t\t\t\n\t\t\t\n\n\n\n\n\t\t\t\n\t\t\t\n\n\t\t\t\n\t\t\t\n\t\t\t\t\n\n\n\n\n\n\n\t\t\t\n\n\t\t\t\n\t\t\t\n\n\t\t\t\n\t\t\t\n\n\n\n\n\n\t\t\t\n\t\t\t\n\n\t\t\n\t\n\t\n\t\n\n \n \n\t\n<\/table>\n<\/div>"}}}'; 

$decoded = json_decode($json_string); 
$html = $decoded->Value->content->price_feature_div; 

$dom = new DOMDocument(); 
$dom->loadHTML($html); 

$xpath = new DOMXPath($dom); 

//frem dom method 
$elements = $dom->getElementById("priceblock_ourprice")->item(0); 

//OR use extract it from xpath like below line 
//$priceNode = $xpath->query("//*[@id='priceblock_ourprice']"); 

if (!is_null($elements)) { 
    $priceNode = $elements->item(0); 
    $ourPrice = $priceNode; 
    echo $ourPrice; 
} 

экстракции в интерфейсе (я использовал JQuery ниже в растворе)

var jsonObj={ 
      "ASIN" : "B00DR4LYHY", 
      "FeatureName" : "price_feature_div", 
      "Type" : "JSON", 
      "Value" : 
      { 
       "content" : 
       {"price_feature_div":"<div id=\"price\" class=\"a-section a-spacing-small\">\n<table class=\"a-lineitem\">\n \n\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\n\n\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t \n\t\t\t\t \n\t\t\t\t \n\t\t\t\t \n\t\t\t\t \n\t\t\t\t \n\t\t\t\t  \n\t\t    \n\t\t       \n\t\t\t\t  \n\t\t    \n\t\t\t\t  \n\n\n\n\n\n\t\n<tr>\n <td class=\"a-color-secondary a-size-base a-text-right a-nowrap\">Price:<\/td>\n <td class=\"a-span12\">\n  <span id=\"priceblock_ourprice\" class=\"a-size-medium a-color-price\">$37.60<\/span>\n  \n\n\n\n  \n\n\n\n\n\n\n  \n\n  <span id=\"ourprice_shippingmessage\">\t\n  \t\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n \n  \n  \n  \n\n\t \n\t\t\n\t\t\n  \n   <span class=\"a-size-base a-color-base\">& <b>FREE Shipping<\/b><\/span>\n  \n  \n \n\n\n\n  <\/span>\n  \n  \n  \n  \n <\/td>\n<\/tr>\n\n\t\t\t\t \n\t\t\t\t \n\t\t\t\t \n\t\t\t\t \n\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\n\t\t   \n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\n\t\t\t\n\t\t\t\n\n\n\n\n\t\t\t\n\t\t\t\n\n\t\t\t\n\t\t\t\n\t\t\t\t\n\n\n\n\n\n\n\t\t\t\n\n\t\t\t\n\t\t\t\n\n\t\t\t\n\t\t\t\n\n\n\n\n\n\t\t\t\n\t\t\t\n\n\t\t\n\t\n\t\n\t\n\n \n \n\t\n<\/table>\n<\/div>"} 

     } 
    }; 
//using jQuery we extracted the price 
var ourPrice = $(jsonObj.Value.content.price_feature_div).find("#priceblock_ourprice").text(); 

console.log(ourPrice);//"$37.60" is the value you can see in the browser-console 

Примечание: Я нашел ошибку синтаксиса в "price_feature_div" HTML значения (в значении JSON оно должно быть в одной строке, даже это строка HTML). Заметил два разрыва строки в HTML.

+0

Спасибо за ваш ответ но я не могу получить этот вывод. Что это за слово «val» в «val ourPrice = $ (jsonObj ...» Я нахожусь в php и не знаю, что это значит, и я получаю этот источник от URL (я отправлю URL-адрес в моем вопросе), так что будет точный код? – Emilios1995

+0

Добро пожаловать. Извините, что опечатка его должна быть 'var', теперь я исправил, пожалуйста, взгляните. Любопытно узнать, где вы делаете извлечение? Серверная сторона (back-end) или клиентская сторона (front-end)? –

+0

Обновленный ответ с php-кодом; Извлечение сделано с помощью DOM после json_decode (уже предложенный @MarcB) –

0

Я думаю, что лучше было бы использовать Regex, но то, что должно выражение выглядеть

В некоторых случаях регулярное выражение работает лучше, чем XPath (для ограниченного размера неструктурированные HTML фрагменты текста).

Итак, вы просто получаете необработанные данные и придерживаетесь $, вы получаете то, что хотите.

$page = file_get_contents($URL); 
$pattern = '/\$[\d.]+/'; 
$preg_match($page, $pattern, $matches); 
echo 'price = ', $matches[0]; 

См. working demo.

Смежные вопросы