如何使用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
相关产品推荐
相关产品推荐

