You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Mojo::DOM 如何从DOM对象中迭代提取多组关联结果数据?

思路偏差定位

你之前的解析逻辑存在方向上的错位:全局批量查询同类型标签的方式,完全抛弃了DOM结构本身的嵌套归属关系,自然无法关联同一个子分区内的不同数据;而手动抓取单个子分区的方式,本质是漏掉了“遍历全量子分区”的环节,没有把每个子分区当作独立的、带局部上下文的解析单元。
正确的核心逻辑必须是:先定位所有子分区作为独立处理单元,再在每个单元的局部范围内提取所需字段,从流程上保证数据的块内关联性。

正确实现的关键逻辑
  • 先锚定主结果容器div.resultsSection的位置,避免解析到页面其他区域同名称的无关节点
  • 在主容器的范围内,批量获取所有div.subSection的节点集合,作为全量遍历的对象——这一步直接解决“无法自动遍历所有子分区”的问题
  • 对集合中的每一个子分区节点,始终以该节点为查询上下文,在其内部查找对应的标签:
    • 直接取该子分区下的p.coolStuff节点提取内容
    • 按优先级判断:先查该子分区下是否存在div.importantStuff,存在则提取对应内容;不存在则回退取div.differentClass的内容
  • 每处理完一个子分区,就把提取到的关联数据打包存入结果集,全程不会出现跨块串数据的问题
参考实现代码
use Mojo::DOM;

# $html为抓取到的页面原始HTML内容
my $dom = Mojo::DOM->new($html);
my @result_set;

# 锚定主结果区,排除范围外的干扰节点
my $results_root = $dom->at('div.resultsSection');
return [] unless $results_root;

# 遍历所有子分区逐块处理
for my $sub_section ($results_root->find('div.subSection')->each) {
    my %item;
    # 提取coolStuff字段内容
    my $cool_node = $sub_section->at('p.coolStuff');
    $item{cool_content} = $cool_node ? $cool_node->text : '';
    
    # 按优先级提取关联块内容
    my $related_node = $sub_section->at('div.importantStuff') 
                        || $sub_section->at('div.differentClass');
    $item{related_content} = $related_node ? $related_node->text : '';
    
    push @result_set, \%item;
}

关键避坑点:所有字段查询的上下文必须绑定在当前遍历的子分区节点上,不能退回全局DOM对象做查询。如果用全局上下文查单个字段,Mojo::DOM的at()方法只会返回整个文档里第一个匹配的节点,最终会出现所有子分区提取到的关联数据完全一致、和对应块内容不匹配的问题。

内容的提问来源于stack exchange,提问作者Wolf

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.28 00:15:03