AppleScript调用JavaScript获取Facebook好友链接返回空值的问题
问题解答
1. AppleScript+Safari执行XPath能否直接获取数组/列表结果?
不能直接返回数组。document.evaluate()返回的是XPathResult对象,而非原生JS数组。你需要手动遍历这个结果对象,把每个节点的属性值提取出来存入JS数组,AppleScript才能识别为列表。示例代码如下:
tell application "Safari" open location "https://www.facebook.com/friends/list" -- 建议延长等待时间或改用更可靠的元素等待逻辑,避免固定延迟导致的加载不完整 delay 8 set friendUrls to do JavaScript " let result = document.evaluate('//a[contains(@href, \"/profile.php\") or contains(@href, \"/user/\")]', document, null, XPathResult.ORDERED_NODE_ITERATOR_TYPE, null); let urls = []; let node; while (node = result.iterateNext()) { urls.push(node.href); } urls; " in front document end tell
这段代码会把符合条件的好友链接存入数组,AppleScript执行后就能拿到完整的URL列表。
2. XPath和document.evaluate参数的问题
(1)XPath的问题
你的原XPath完全依赖DOM层级结构,Facebook页面的DOM会频繁更新,这种硬编码层级的XPath极易失效,这也是它在控制台也拿不到结果的原因——当前页面根本没有匹配该层级的节点。
修改后的带string()的XPath能在控制台拿到值,但AppleScript执行无返回,大概率是因为:
- 固定
delay 5时间太短,好友列表尚未完全渲染; - 单个节点的XPath通过
document.evaluate()返回的结果需要手动提取值,无法直接返回字符串。
(2)document.evaluate参数的问题
你使用的第四个参数是0(对应XPathResult.UNORDERED_NODE_ITERATOR_TYPE),该类型用于遍历节点集,但原XPath目标是@href属性节点,更合适的做法是将结果类型改为XPathResult.STRING_TYPE,或者直接定位<a>元素再提取href属性——后者比定位属性节点更稳定。
另外需要注意:Facebook好友列表是滚动动态加载的,若要获取全部好友链接,还需添加滚动加载的逻辑,否则只能拿到当前可见区域的好友链接。
内容的提问来源于stack exchange,提问作者d-b
相关产品推荐
相关产品推荐

