使用XPath提取元素background-image的url值返回null如何解决
问题原因
- 类名匹配规则错误:原XPath查询语句为
//*[@class="zoomWindow "],类名尾部多写了一个空格,和目标元素的class="zoomWindow"属性值不匹配,导致无法查询到对应DOM元素。 - 字符串截取边界错误:原提取逻辑默认background-image的url用单引号
'包裹,但目标元素的url实际用双引号"包裹,截取边界不匹配,即使拿到元素也无法提取到正确的url值。
修正后代码
<?php $doc = new DOMDocument; $doc->preserveWhiteSpace = false; $doc->strictErrorChecking = false; $doc->recover = true; ini_set('user_agent', 'My-Application/2.5'); libxml_use_internal_errors(true); $doc->loadHTMLFile('https://www.revolve.com/elliatt-cassini-dress/dp/ELLI-WD346/?d=Womens&srcType=hp_recs_viewed'); $xpath = new DOMXPath($doc); // 修正类名匹配,去掉尾部多余空格 $imgs = $xpath->query('//*[@class="zoomWindow"]'); $datae = []; // 初始化数组避免未定义报错 foreach($imgs as $b){ $datae[] = array( // 修正截取边界,匹配双引号包裹的url格式 'img' => $xpath->evaluate( 'substring-before(substring-after(./@style, "background-image: url(\""), "\")")', $b ), ); } var_dump($datae); ?>
补充说明
如果运行后仍然返回空,可检查目标页面是否为前端动态渲染内容:loadHTMLFile仅能获取页面静态源代码,若zoomWindow元素是JS动态生成的,静态爬取无法拿到对应内容,需搭配无头浏览器渲染页面后再提取。
内容的提问来源于stack exchange,提问作者Devin Y
相关产品推荐
相关产品推荐

