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

如何使用SoupSieve选择器抓取Drivers与Constraints元素之间的列表内容

SoupSieve选取两个指定节点之间同级元素的方案

方案1:纯CSS选择器实现

利用:not伪类过滤掉终止节点之后的内容,选择器写法如下:

dd:-soup-contains-own("Drivers") ~ dd:not(dd:-soup-contains-own("Constraints") ~ dd):not(:-soup-contains-own("Constraints"))

你原来的代码可以修改为:

def get_drivers():
    data.append({
        'url': url,
        'type': 'driver',
        'list': [x.get_text(strip=True) for x in toc.select('dd:-soup-contains-own("Drivers") ~ dd:not(dd:-soup-contains-own("Constraints") ~ dd):not(:-soup-contains-own("Constraints"))')]
    })
  • 逻辑说明:先选中「Drivers节点后的所有同级dd」,再排除「Constraints节点后的所有同级dd」,最后排除「Constraints节点本身」,刚好拿到两个节点中间的所有内容。

方案2:遍历同级节点实现(更推荐)

如果存在文本匹配误差、或多个匹配节点的场景,用遍历的方式容错性更高,逻辑也更清晰:

def get_drivers():
    # 先定位起止节点
    start_dd = toc.select_one('dd:-soup-contains-own("Drivers")')
    end_dd = toc.select_one('dd:-soup-contains-own("Constraints")')
    driver_items = []
    
    if start_dd and end_dd:
        # 从起始节点的下一个同级dd开始遍历
        current = start_dd.find_next_sibling('dd')
        while current != end_dd:
            # 防止end_dd不存在时出现死循环
            if not current:
                break
            driver_items.append(current.get_text(strip=True))
            current = current.find_next_sibling('dd')
    
    data.append({
        'url': url,
        'type': 'driver',
        'list': driver_items
    })
  • 优势:可以兼容中间节点数量为0的场景,也能处理起止节点不存在的异常情况,后续如果调整起止匹配规则也更方便,不依赖复杂的CSS选择器语法。

两种方案得到的列表都可以直接传入pandas导出到CSV的独立单元格,不需要额外处理。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 23:36:03