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