如何在PHP爬虫中通过HTML类名抓取数据?获取书籍星级评分
从HTML元素的Class属性中提取书籍评分(PHP XPath实现)
问题场景
需要从类似 <p class="star_rating five"></p> 的HTML元素中提取书籍评分(示例中的five就是评分标识),目前已写出部分PHP XPath代码,想知道如何进一步获取class属性里的评分信息。
用户已编写的代码:
$prices = $xpath->evaluate('//ol[@class="row"]//li//article//div[@class="product_price"]//p[@class="price_color"]'); $rating =$xpath->evaluate('//ol[@class="row"]//li//article//p[@class]');
解决方案
步骤1:精准定位评分元素
当前的$rating XPath会选中所有带class的p标签,容易混入无关元素。可以通过contains(@class, 'star_rating')筛选出仅属于评分的p标签,优化后的XPath:
//ol[@class="row"]//li//article//p[contains(@class, 'star_rating')]
步骤2:提取并处理class属性中的评分
遍历选中的元素,获取class属性值后拆分,过滤掉固定的star_rating,剩下的就是评分标识。如果需要转换成数字评分,还可以做映射处理。
完整代码示例:
// 精准定位所有评分元素 $ratingElements = $xpath->evaluate('//ol[@class="row"]//li//article//p[contains(@class, "star_rating")]'); $ratings = []; // 可选:将英文评分映射为数字 $ratingMap = [ 'one' => 1, 'two' => 2, 'three' => 3, 'four' => 4, 'five' => 5 ]; foreach ($ratingElements as $element) { // 获取元素的class属性值 $classValue = $element->getAttribute('class'); // 按空格拆分class属性,同时去除首尾空格 $classParts = explode(' ', trim($classValue)); // 过滤掉"star_rating",得到评分标识 $ratingLabel = array_diff($classParts, ['star_rating']); $ratingLabel = reset($ratingLabel); // 可选:转换成数字评分,否则直接存储英文标识 $ratings[] = $ratingMap[$ratingLabel] ?? $ratingLabel; } // 输出所有评分结果 print_r($ratings);
补充说明
- 用
contains(@class, 'star_rating')可以精准锁定评分元素,避免无关p标签干扰。 - 拆分class属性时用
trim()处理首尾空格,防止出现空数组元素影响后续过滤。 - 如果页面评分的class规则调整(比如新增其他无关class),只需修改过滤逻辑即可适配。
内容的提问来源于stack exchange,提问作者Vupesh Awasthi
相关产品推荐
相关产品推荐

