使用PHP Simple HTML DOM Parser获取页面span值时触发致命错误:Call to a member function find() on bool
解决PHP调用find()时的布尔值致命错误
嘿,这个错误的根源其实很清晰:file_get_html()没成功拿到目标页面的HTML内容,返回了false(布尔值),你直接对这个布尔值调用find()方法,肯定会触发致命错误。咱们一步步来搞定它:
1. 先排查file_get_html失败的原因
像Investing.com这类网站,会通过检查请求头拦截非浏览器发起的请求。你可以先增加错误检测,再换带请求头的方式尝试请求:
<?php include('simple_html_dom.php'); // 先尝试直接获取页面,失败则换带请求头的方式 $html = file_get_html('https://ru.investing.com/commodities/gold'); if (!$html) { // 模拟Chrome浏览器的请求头,绕过基础反爬限制 $context = stream_context_create([ 'http' => [ 'header' => "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36\r\n" ] ]); // 用file_get_contents带请求头获取原始HTML内容 $rawHtml = file_get_contents('https://ru.investing.com/commodities/gold', false, $context); if ($rawHtml === false) { die('无法获取页面内容,请检查网络连接或目标网站的访问限制'); } // 将原始HTML转换为simple_html_dom对象 $html = str_get_html($rawHtml); } // 查找元素前先检查元素是否存在,避免再次报错 $targetSpan = $html->find("span[class=arial_26 inlineblock pid-8830-last]", 0); if ($targetSpan) { echo $targetSpan->plaintext; } else { echo '未找到指定的span元素!请打开目标页面开发者工具,确认元素class是否正确'; } ?>
2. 核心修复点说明
- 添加浏览器请求头:这是绕开基础反爬的关键,Investing.com会拒绝不带
User-Agent的请求,模拟常见浏览器的标识即可正常访问。 - 增加多层错误检测:先确认HTML对象创建成功,再确认目标元素存在,彻底避免“调用布尔值的成员方法”这类致命错误。
- 灵活切换解析方式:当
file_get_html直接请求失败时,改用file_get_contents获取原始内容再解析,兼容性更强。
3. 额外注意事项
- 先确认
simple_html_dom.php的文件路径正确,不要出现引入错误。 - 如果还是无法获取内容,可能网站有更严格的反爬机制(如Cookie验证、IP限制),此时可以尝试使用cURL库发起请求,功能更强大。
- 最后核对元素选择器:网站的class可能会动态变化,打开目标页面按F12进入开发者工具,确认目标span的class是否确实为
arial_26 inlineblock pid-8830-last。
内容的提问来源于stack exchange,提问作者kamazz
相关产品推荐
相关产品推荐

