为了账号安全,请及时绑定邮箱和手机立即绑定

如何获取 xPath nodeValue 美元金额

如何获取 xPath nodeValue 美元金额

PHP
叮当猫咪 2022-06-17 15:22:13
我试图从交易时<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>
查看完整描述

3 回答

?
www说

TA贡献1775条经验 获得超8个赞

万一其他人将来偶然发现这个问题,我将在评论中总结通过与 OP 对话得出的解决方案:

这里的问题不在于 DOM 选择器,正如他的输出是 0.00 美元这一事实所观察到的那样,即使他没有将值格式化为显示为货币。这让我相信被抓取的网站实际上是在使用占位符值,这些占位符值在客户端使用 Javascript 进行更新。选择器无法解决这个问题的原因是 PHP 接收到的 DOM 将是初始渲染,它不包含我们希望抓取的值。

因此,解决方案是检查被抓取的网站,以确定在将值添加到客户端的 DOM 之前从何处以及如何获取这些值。例如,如果网站使用 API 调用来获取值,则可以简单地使用相同的 API 来获取预期的数据,而无需抓取 HTML DOM。


查看完整回答
反对 回复 2022-06-17
?
慕田峪4524236

TA贡献1875条经验 获得超5个赞

您可能会发现使用正则表达式来匹配价格更容易和更快,这是 PHP 中的一个简单示例:


<?php


// Your input HTML (as per your example)

$inputHtml = <<<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>

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)) {

    echo 'Price found: ' . $matches[1][0] . PHP_EOL;

}

控制台输出:


Price found: 1,034.29


查看完整回答
反对 回复 2022-06-17
?
LEATH

TA贡献1936条经验 获得超7个赞

如果您从字面上遵循 OPs 问题


start from the <span> element that has text "Value when transacted"

get its parent <div>

get following sibling which is a <div> 

get the text of the child <span>

那么xpath表达式应该是


//span[text()='Value when transacted']/parent::div/following-sibling::div/span


查看完整回答
反对 回复 2022-06-17
  • 3 回答
  • 0 关注
  • 128 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号