document.evaluate JavaScript returns AppleScript 中没有任何内容
document.evaluate JavaScript returns nothing in AppleScript
我正在编写一个 AppleScript 脚本来在 Safari 中抓取网页,有一段我一直在努力研究。
此returns所需文字:log (do JavaScript "document.querySelector('h1 > span').innerHTML;" in front document)
而这不是:log (do JavaScript "document.evaluate('//h1/span/text()[normalize-space()]', document.body, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;" in front document)
在浏览器检查器中,这两种方法都有效,但在 AppleScript 中,xpaths 的任何变体都不适合我。
而且我确实需要使用 document.evaluate
函数在同一个脚本中执行类似 document.evaluate("//p[contains(., 'Metrics')]/following-sibling::p[1]/text()[normalize-space()]", document.body, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;
的操作。
如何重写才能开始在 AppleScript 中产生结果?
示例 HTML 代码:
<html>
<body>
<h1>
<span>Test Entry</span>
</h1>
</body>
</html>
Safari Web Inspector 输出(表明 querySelector
和 evaluate
都可以正常工作):
> document.querySelector('h1 > span').innerHTML;
< "Test Entry"
> document.evaluate('//h1/span/text()[normalize-space()]', document.body, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;
< "Test Entry"
AppleScript 编辑器代码:
tell application "Safari"
log (do JavaScript "document.querySelector('h1 > span').innerHTML;" in front document)
log (do JavaScript "document.evaluate('//h1/span/text()[normalize-space()]', document.body, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;" in front document)
end tell
AppleScript 编辑器输出(证明 querySelector
有效而 evaluate
无效):
(*Test Entry*)
(**)
您用于最小样本 (//h1/span/text()[normalize-space()]
) 的 XPath 表达式在浏览器中选择一个文本节点 DOM 并使用 document.evaluate('//h1/span/text()[normalize-space()]', document.body, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue
您的 Javascript 代码returns 那个文本节点 (https://dom.spec.whatwg.org/#text)。虽然浏览器的专用检查器可能会直接显示文本节点的内容,但您的 AppleScript 控制台似乎不会这样做。
如果您希望您的 Javascript 代码成为 return 带有文本节点值的纯字符串,您可以使用 data
属性 (https://dom.spec.whatwg.org/#dom-characterdata-data)文本节点,就像您使用从 querySelector
调用中获得的元素节点的 innerHTML
属性 一样。
所以
document.evaluate('//h1/span/text()[normalize-space()]', document.body, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue
in Javascript returns 一个 DOM 文本节点并获取包含文本节点内容的字符串,使用 data
属性 与例如
document.evaluate('//h1/span/text()[normalize-space()]', document.body, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue.data
另一种选择是使用
document.evaluate('//h1/span/text()[normalize-space()]', document.body, null, XPathResult.STRING_TYPE, null).stringValue
因为你想要一个最小的例子,还请注意,只要你使用以 /
或 //
开头的绝对 XPath,你就不会使用 document.body
获得任何东西作为 document.evaluate
的第二个参数,单独传递 document
也足够并给出相同的结果。
我正在编写一个 AppleScript 脚本来在 Safari 中抓取网页,有一段我一直在努力研究。
此returns所需文字:log (do JavaScript "document.querySelector('h1 > span').innerHTML;" in front document)
而这不是:log (do JavaScript "document.evaluate('//h1/span/text()[normalize-space()]', document.body, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;" in front document)
在浏览器检查器中,这两种方法都有效,但在 AppleScript 中,xpaths 的任何变体都不适合我。
而且我确实需要使用 document.evaluate
函数在同一个脚本中执行类似 document.evaluate("//p[contains(., 'Metrics')]/following-sibling::p[1]/text()[normalize-space()]", document.body, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;
的操作。
如何重写才能开始在 AppleScript 中产生结果?
示例 HTML 代码:
<html>
<body>
<h1>
<span>Test Entry</span>
</h1>
</body>
</html>
Safari Web Inspector 输出(表明 querySelector
和 evaluate
都可以正常工作):
> document.querySelector('h1 > span').innerHTML;
< "Test Entry"
> document.evaluate('//h1/span/text()[normalize-space()]', document.body, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;
< "Test Entry"
AppleScript 编辑器代码:
tell application "Safari"
log (do JavaScript "document.querySelector('h1 > span').innerHTML;" in front document)
log (do JavaScript "document.evaluate('//h1/span/text()[normalize-space()]', document.body, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;" in front document)
end tell
AppleScript 编辑器输出(证明 querySelector
有效而 evaluate
无效):
(*Test Entry*)
(**)
您用于最小样本 (//h1/span/text()[normalize-space()]
) 的 XPath 表达式在浏览器中选择一个文本节点 DOM 并使用 document.evaluate('//h1/span/text()[normalize-space()]', document.body, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue
您的 Javascript 代码returns 那个文本节点 (https://dom.spec.whatwg.org/#text)。虽然浏览器的专用检查器可能会直接显示文本节点的内容,但您的 AppleScript 控制台似乎不会这样做。
如果您希望您的 Javascript 代码成为 return 带有文本节点值的纯字符串,您可以使用 data
属性 (https://dom.spec.whatwg.org/#dom-characterdata-data)文本节点,就像您使用从 querySelector
调用中获得的元素节点的 innerHTML
属性 一样。
所以
document.evaluate('//h1/span/text()[normalize-space()]', document.body, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue
in Javascript returns 一个 DOM 文本节点并获取包含文本节点内容的字符串,使用 data
属性 与例如
document.evaluate('//h1/span/text()[normalize-space()]', document.body, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue.data
另一种选择是使用
document.evaluate('//h1/span/text()[normalize-space()]', document.body, null, XPathResult.STRING_TYPE, null).stringValue
因为你想要一个最小的例子,还请注意,只要你使用以 /
或 //
开头的绝对 XPath,你就不会使用 document.body
获得任何东西作为 document.evaluate
的第二个参数,单独传递 document
也足够并给出相同的结果。