猿问

如何获取 xPath nodeValue 美元金额

我试图从交易时<span>具有文本值的元素开始


然后得到它的父母<div>并得到跟随的兄弟,这是 a<div>并从中<div>得到孩子的文本<span>。


据我所知,代码是正确的,应该回显 $1,034.29。


它改为 0.00 美元。


我在这里想念什么?


php代码:


$a = new DOMXPath($doc);

$dep_val_txt = $a->query("//span[contains(text(), 'Value when transacted')]");

$dep_val_nxt_elem = $a->query("parent::div", $dep_val_txt[0]);

$dep_val_elem = $a->query("following-sibling::*[1]", $dep_val_nxt_elem[0]);

$dep_val = $dep_val_elem->item(0)->childNodes->item(0)->nodeValue;


echo $dep_val;

html代码:


<div class="sc-8sty72-0 cyLejs">

  <span class="sc-1ryi78w-0 bFGdFC sc-16b9dsl-1 iIOvXh sc-1n72lkw-0 bKaZjn" opacity="1">Value when transacted</span>

</div>

<div class="sc-8sty72-0 cyLejs">

  <span class="sc-1ryi78w-0 bFGdFC sc-16b9dsl-1 iIOvXh u3ufsr-0 gXDEBk" opacity="1">$1,034.29</span>

</div>


叮当猫咪
浏览 130回答 3
3回答

www说

万一其他人将来偶然发现这个问题,我将在评论中总结通过与 OP 对话得出的解决方案:这里的问题不在于 DOM 选择器,正如他的输出是 0.00 美元这一事实所观察到的那样,即使他没有将值格式化为显示为货币。这让我相信被抓取的网站实际上是在使用占位符值,这些占位符值在客户端使用 Javascript 进行更新。选择器无法解决这个问题的原因是 PHP 接收到的 DOM 将是初始渲染,它不包含我们希望抓取的值。因此,解决方案是检查被抓取的网站,以确定在将值添加到客户端的 DOM 之前从何处以及如何获取这些值。例如,如果网站使用 API 调用来获取值,则可以简单地使用相同的 API 来获取预期的数据,而无需抓取 HTML DOM。

慕田峪4524236

您可能会发现使用正则表达式来匹配价格更容易和更快,这是 PHP 中的一个简单示例:<?php// Your input HTML (as per your example)$inputHtml = <<<HTML<div class="sc-8sty72-0 cyLejs">&nbsp; <span class="sc-1ryi78w-0 bFGdFC sc-16b9dsl-1 iIOvXh sc-1n72lkw-0 bKaZjn" opacity="1">Value when transacted</span></div><div class="sc-8sty72-0 cyLejs">&nbsp; <span class="sc-1ryi78w-0 bFGdFC sc-16b9dsl-1 iIOvXh u3ufsr-0 gXDEBk" opacity="1">$1,034.29</span></div>HTML;$matches = [];// Look for any div > span element which contains a string starting with $ and then match a number (allowing for a , or . within the price matched).if (preg_match_all('#<div.*>\s*<span.*?>\$([0-9.,]+)</span>\s*</div>#mis', $inputHtml, $matches)) {&nbsp; &nbsp; echo 'Price found: ' . $matches[1][0] . PHP_EOL;}控制台输出:Price found: 1,034.29

LEATH

如果您从字面上遵循 OPs 问题start from the <span> element that has text "Value when transacted"get its parent <div>get following sibling which is a <div>&nbsp;get the text of the child <span>那么xpath表达式应该是//span[text()='Value when transacted']/parent::div/following-sibling::div/span
随时随地看视频慕课网APP
我要回答