从以下结构:
我尝试使用以下代码获取标记的文本:
$price_new='div/div[@class="cat_price"]/text()';
if ($price_new!=null && $node = $Website_Xpath->query ($price_new, $row )) {
$result [$value] ['Price'] = $node->item( 0 )->nodeValue;
} else {
$result [$value] ['Price'] = "";
}
但节点值为NULL
。如何正确获取数字?
答案 0 :(得分:0)
您的$Website_Xpath
看起来像DOMXPath
的对象。然后,您的代码的主要问题在于XPath表达式:'div/div[@class="cat_price"]/text()'
。您正尝试从无处获取div
。是从根节点提供完整路径(例如/html/body/div
),还是选择所有带有//
前缀的div。
示例强>
$xml = <<<'XML'
<body>
<div class="cat_price">
<div class="was">67,000 - PKR</div>
64,9999<span> - PKR</span>
</div>
</body>
XML;
$doc = new DOMDocument();
$doc->loadXML($xml);
$text = '';
$xpath = new DOMXPath($doc);
// Select all text nodes within a <div> having class="cat_price"
if ($nodes = $xpath->query('//div[@class="cat_price"]/text()')) {
// Search for a node with some content, except spaces
foreach ($nodes as $n) {
if ($text = trim($n->nodeValue))
break;
}
}
var_dump($text);
输出
string(7) "64,9999"
答案 1 :(得分:0)
您应该提供实际代码段,而不仅仅是截图。如果我正确解释了屏幕截图,则代码段如下:
$xml = <<<'XML'
<body>
<div class="cat_price">
<div class="was">67,000 - PKR</div>
"
64,9999"<span> - PKR</span>
</div>
</body>
XML;
带有价格的文本节点是具有类was
的div的以下兄弟节点。因此可以使用该轴获取它:
$document = new DOMDocument();
$document->loadXml($xml);
$xpath = new DOMXpath($document);
$expression = 'string(//div[@class="cat_price"]
/div[@class="was"]/following-sibling::text()[1])';
var_dump($xpath->evaluate($expression));
与DOMXpath::query()
不同,DOMXpath::evaluate()
可以根据表达式返回标量值。字符串强制转换或字符串函数将返回一个字符串。
string(25) "
"
64,9999""
但结果不仅包含数字,还包含引号和一些空格。 translate()
和normalize-space()
可用于清理它:
$expression = 'normalize-space(
translate(//div[@class="cat_price"]
/div[@class="was"]/following-sibling::text()[1], \'"\', " ")
)';
var_dump($xpath->evaluate($expression));
输出:
string(7) "64,9999"