DOMXPath/PHP - 仅在特定出现后获取值
DOMXPath/PHP - Get a value only after specific occurrence
伙计们,我正在解析一个 URL 以获得 HTML dom 个元素。
这是我的代码:
<?PHP
$url = 'http://www.sportsdirect.com/nike-satire-mens-skate-shoes-242188?colcode=24218822';
libxml_use_internal_errors(true);
$dom = new DOMDocument;
$dom->loadHTMLFile($url);
$xp = new DOMXPath($dom);
$qry = '//script[starts-with(normalize-space(.), "var colourVariantsInitialData")]';
$rawtxt = $xp->query($qry)->item(0)->nodeValue;
$jsonStart = strpos($rawtxt, '[');
$jsonEnd = strrpos($rawtxt, ']');
$collections = json_decode(substr($rawtxt, $jsonStart, $jsonEnd - $jsonStart + 1));
foreach ($collections[1]->SizeVariants as $item) {
$SizeName = $item->SizeName;
$PriceUnformated = $item->ProdSizePrices->SellPrice;
$find = array('£');
$replace = array('');
$Price = str_replace($find, $replace, $PriceUnformated);
echo "SizeName: <b>$SizeName</b> - Price: <b>$Price</b><br>";
}
此代码正在从输出源的脚本中提取 "text"。
这是此脚本的完整文本:http://pastebin.com/FwK9Z8CP
我的代码给出了以下结果:
SizeName: 7 (41) - Price: 27.00
SizeName: 8 (42.5) - Price: 36.00
SizeName: 9 (44) - Price: 36.00
SizeName: 9.5 (44.5) - Price: 36.00
SizeName: 11 (46) - Price: 36.00
我的问题是:
我如何才能只获得特定 SizeName 的结果,例如 SizeName 7 (41)?
提前致谢!
$specific
有您要查找的字符串。将代码中的 foreach
更改为:
$specific = '7 (41)';
foreach ($collections[1]->SizeVariants as $item) {
$SizeName = $item->SizeName;
if(trim($SizeName) == trim($specific)) {
$PriceUnformated = $item->ProdSizePrices->SellPrice;
$find = array('£');
$replace = array('');
$Price = str_replace($find, $replace, $PriceUnformated);
echo "SizeName: <b>$SizeName</b> - Price: <b>$Price</b><br>";
}
}
How I can get only the result for a specific SizeName, for example let's say for SizeName 7 (41) ?
由于整个文本是 XML 文档的一部分,因此您不能使用 XML 解析器。
所以从技术上讲这不是 xpath 问题。
您已经将字符串解析为 JSON 并且您成功了。但是你还是不够自信
因此,您可以开发一个在 JSON 数据之上工作的数据模型,然后对其实施过滤器。一个简单的模型可以使用 Interator 来遍历项目,并使用 FilterIterator 来仅选择具有特定 属性 值的项目。
...
$xpath = new DOMXPath($dom);
$query = '//script[starts-with(normalize-space(.), "var colourVariantsInitialData")]';
$script = $xpath->query($query)->item(0)->nodeValue;
$variants = SizeVariants::create($script); # Iterator
$variants = new SizeFilter($variants); # FilterIterator
foreach ($variants as $item) {
$SizeName = $item->SizeName;
$PriceUnformated = $item->ProdSizePrices->SellPrice;
$find = array('£');
$replace = array('');
$Price = str_replace($find, $replace, $PriceUnformated);
echo "SizeName: **$SizeName** - Price: **$Price**\n";
}
示例输出(降价):
SizeName: 7 (41) - Price: 27.00
伙计们,我正在解析一个 URL 以获得 HTML dom 个元素。
这是我的代码:
<?PHP
$url = 'http://www.sportsdirect.com/nike-satire-mens-skate-shoes-242188?colcode=24218822';
libxml_use_internal_errors(true);
$dom = new DOMDocument;
$dom->loadHTMLFile($url);
$xp = new DOMXPath($dom);
$qry = '//script[starts-with(normalize-space(.), "var colourVariantsInitialData")]';
$rawtxt = $xp->query($qry)->item(0)->nodeValue;
$jsonStart = strpos($rawtxt, '[');
$jsonEnd = strrpos($rawtxt, ']');
$collections = json_decode(substr($rawtxt, $jsonStart, $jsonEnd - $jsonStart + 1));
foreach ($collections[1]->SizeVariants as $item) {
$SizeName = $item->SizeName;
$PriceUnformated = $item->ProdSizePrices->SellPrice;
$find = array('£');
$replace = array('');
$Price = str_replace($find, $replace, $PriceUnformated);
echo "SizeName: <b>$SizeName</b> - Price: <b>$Price</b><br>";
}
此代码正在从输出源的脚本中提取 "text"。 这是此脚本的完整文本:http://pastebin.com/FwK9Z8CP
我的代码给出了以下结果:
SizeName: 7 (41) - Price: 27.00
SizeName: 8 (42.5) - Price: 36.00
SizeName: 9 (44) - Price: 36.00
SizeName: 9.5 (44.5) - Price: 36.00
SizeName: 11 (46) - Price: 36.00
我的问题是:
我如何才能只获得特定 SizeName 的结果,例如 SizeName 7 (41)?
提前致谢!
$specific
有您要查找的字符串。将代码中的 foreach
更改为:
$specific = '7 (41)';
foreach ($collections[1]->SizeVariants as $item) {
$SizeName = $item->SizeName;
if(trim($SizeName) == trim($specific)) {
$PriceUnformated = $item->ProdSizePrices->SellPrice;
$find = array('£');
$replace = array('');
$Price = str_replace($find, $replace, $PriceUnformated);
echo "SizeName: <b>$SizeName</b> - Price: <b>$Price</b><br>";
}
}
How I can get only the result for a specific SizeName, for example let's say for SizeName 7 (41) ?
由于整个文本是 XML 文档的一部分,因此您不能使用 XML 解析器。
所以从技术上讲这不是 xpath 问题。
您已经将字符串解析为 JSON 并且您成功了。但是你还是不够自信
因此,您可以开发一个在 JSON 数据之上工作的数据模型,然后对其实施过滤器。一个简单的模型可以使用 Interator 来遍历项目,并使用 FilterIterator 来仅选择具有特定 属性 值的项目。
...
$xpath = new DOMXPath($dom);
$query = '//script[starts-with(normalize-space(.), "var colourVariantsInitialData")]';
$script = $xpath->query($query)->item(0)->nodeValue;
$variants = SizeVariants::create($script); # Iterator
$variants = new SizeFilter($variants); # FilterIterator
foreach ($variants as $item) {
$SizeName = $item->SizeName;
$PriceUnformated = $item->ProdSizePrices->SellPrice;
$find = array('£');
$replace = array('');
$Price = str_replace($find, $replace, $PriceUnformated);
echo "SizeName: **$SizeName** - Price: **$Price**\n";
}
示例输出(降价):
SizeName: 7 (41) - Price: 27.00