求AppleScript中执行JS提取符合标题条件的DOM元素href的替代方案
嘿,我来帮你搞定这个AppleScript里的JavaScript代码优化,给你几个更简洁靠谱的替代方案,完全贴合你的需求👇
优化后的AppleScript + JavaScript实现方案
方案一:逻辑清晰的分步处理写法
这个方案把筛选和提取拆成明确的步骤,可读性更强,也更健壮:
tell application "Safari" open location "https://teespring.com/search?q=rocker" delay 5 -- 等待页面加载,可根据网络速度调整时长 set theLinks to (do JavaScript " // 把所有.product_card元素转为数组 Array.from(document.querySelectorAll('.product_card')) // 第一步:筛选出标题包含指定关键词的卡片 .filter(card => { const titleElement = card.querySelector('.product_card__title'); // 确保标题元素存在,且文本包含关键词(不区分大小写) return titleElement && /Rocker/gi.test(titleElement.textContent.trim()); }) // 第二步:从符合条件的卡片中提取目标链接 .map(card => card.querySelector('.js-search-product-link').href) // 最后过滤掉可能出现的无效链接 .filter(link => link) ") end tell return theLinks
方案二:用CSS选择器直接定位(更高效)
如果你的Safari版本支持现代CSS选择器,可以直接一步定位到目标链接,减少JS层面的遍历操作:
tell application "Safari" open location "https://teespring.com/search?q=rocker" delay 5 set theLinks to (do JavaScript " // 直接用CSS选择器找到包含目标标题的卡片下的链接 Array.from(document.querySelectorAll('.product_card:has(.product_card__title:contains(\"Rocker\")) .js-search-product-link')) .map(link => link.href) ") end tell
小提示:
:contains()选择器在WebKit内核(Safari用的就是这个)中是支持的,但如果遇到兼容性问题,方案一的逻辑会更稳妥。
关键优化点说明
- 用
Array.from()替代Array.prototype.slice.call(),是ES6+的标准写法,语法更直观 - 给标题文本加了
trim(),避免前后空格干扰关键词匹配 - 拆分
filter和map步骤,让代码逻辑一目了然,后期维护也方便 - 方案二通过CSS选择器直接缩小范围,执行效率更高
这两个方案都完美匹配你的需求:
- 精准检查
.product_card下的.product_card__title是否包含指定搜索词 - 只提取对应卡片下
.js-search-product-link的href链接
内容的提问来源于stack exchange,提问作者GTO
相关产品推荐
相关产品推荐

