Я сделал много соскоб HTML с использованием Xpath. Но теперь я должен почистить JSON и не знаю, как это сделать. Источник, который я хочу очистить:
{
"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 $)
Код, который я использую, предоставленный Venkata:
$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, но как должно выглядеть выражение?
Извлечение с помощью 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.
Я думаю, что лучше всего было бы использовать REGEX, но как должно выглядеть выражение
В некоторых случаях регулярное выражение работает лучше, чем xpath (для неструктурированных фрагментов HTML-текста ограниченного размера).
Таким образом, вы просто получаете сырые данные и придерживаться $
Вы получаете то, что хотите.
$page = file_get_contents($URL);
$pattern = '/\$[\d.]+/';
$preg_match($page, $pattern, $matches);
echo 'price = ', $matches[0];
Увидеть рабочая демо.