【问题标题】:Executing javascript in java - Opening a URL and getting links在 java 中执行 javascript - 打开 URL 并获取链接
【发布时间】:2011-08-30 12:41:27
【问题描述】:
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 中获取它的链接?

【问题讨论】:

    标签: java javascript url get hyperlink


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      根据documentation

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

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

      您可以使用 URL/URLConnecion 类读取 URL,并将其提供给 ScriptEngine。 There is a tutorial here.

      【讨论】:

      • 我喜欢这个答案,除了 w3schools 与维基百科或随机网络搜索结果一样多的“文档”。所以这个答案的前两行是不正确的。
      • 我很惊讶没有人告诉你使用 JavaFX。您可以使用 JFrame 实现无头。
      【解决方案3】:

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

      【讨论】:

      • 实际上,URL 的内容有超链接,我只能使用 document.getElementByTagName('a');因此,为此,我需要将 url 加载到内存中,执行此操作并获取链接
      • 您可以使用正则表达式模式解析字符串。
      • 页面源中没有链接。它由在服务器端执行的 javascript 加载。
      【解决方案4】:

      试试这个:

      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<String> getLinks(String page) {
          Set<String> links = new HashSet<String>();
          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;
      }
      

      【讨论】:

      • 问题是,页面中的链接是由javascript生成的。所以只有在 URL 加载后,链接才会到达。即,它不在 html 文件的源代码中。这就是为什么在加载 url 之后,我执行 document.getElementByTagName('a') 而不是在 java 中使用 URL 类来提取链接。
      • URL.openConnection 模拟客户端浏览器所做的事情,因此您获得的标记与通过浏览器获得的标记完全相同。试试吧,我相信你会发现它有效。如果我不让我知道你得到了什么,我们可以尝试进一步解决。
      • 当然,会告诉你的。
      【解决方案5】:

      你可以使用HtmlUnit是java API,我认为它可以帮助你访问执行的js内容,作为一个简单的html。

      WebClient webClient = new WebClient();
      HtmlPage myPage = (HtmlPage) webClient.getPage(new URL("YourURL"));
      System.out.println(myPage.getVisibleText());
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-10-08
        • 1970-01-01
        • 2021-11-05
        相关资源
        最近更新 更多