在java中执行javascript – 打开URL并获取链接

import javax.script.ScriptEngine; import javax.script.ScriptEngineManager; import java.io.FileReader; public class Main { public static void main(String[] args) { ScriptEngineManager manager = new ScriptEngineManager(); ScriptEngine engine = manager.getEngineByName("js"); try { FileReader reader = new FileReader("C:/yourfile.js"); engine.put("urlfromjava", "http://www.something.com/?asvb"); engine.eval(reader); reader.close(); } catch (Exception e) { e.printStackTrace(); } } } 

现在,yourfile.js包含这一行

 function urlget(url) { print("URL:"+url); var loc = window.open(url); var link = document.getElementsByTagName('a')["61"].href; return ("\nLink is: \n"+link); } var x = urlget(urlfromjava); print(x); 

我收到了错误

 "javax.script.ScriptException: sun.org.mozilla.javascript.internal.EcmaError: ReferenceError: "window" is not defined" 

如何打开URL并从java获取它的链接?

根据文件 :

window对象表示浏览器中的打开窗口。

由于您未在浏览器中执行脚本,因此未定义窗口对象。

您可以使用URL / URLConnecion类读取URL并将其提供给ScriptEngine。 这里有一个教程 。

你可以在Rhino中嵌入Env.js来获得这种function

在javascript window表示浏览器窗口。 因此,当您尝试从Java执行此js时,它无法找到浏览器窗口并且您收到错误。 您可以使用Java中的URL类来获取URL的内容。

尝试这个:

 import java.net.*; import java.io.*; public class URLConnectionReader { public static void main(String[] args) throws Exception { URL yahoo = new URL("http://www.yahoo.com/"); URLConnection yc = yahoo.openConnection(); BufferedReader in = new BufferedReader( new InputStreamReader( yc.getInputStream())); String inputLine; while ((inputLine = in.readLine()) != null) System.out.println(inputLine);// or save to some StringBuilder like this: sb.append(inputLine); then pass the sb.toString() to the method that gets links out of it - > see getLinks below in.close(); } } private static final String CLOSING_QUOTE = "\""; private static final String HREF_PREFIX = "href=\""; private static final String HTTP_PREFIX = "http://"; public static Set getLinks(String page) { Set links = new HashSet(); String[] rawLinks = StringUtils.splitByWholeSeparator(page, HREF_PREFIX); for (String str : rawLinks) { if(str.startsWith(HTTP_PREFIX)) { links.add(StringUtils.substringBefore(str, CLOSING_QUOTE)); } } return links; }