Выполнение javascript на java — открытие URL и получение ссылок

#java #javascript #url #get #hyperlink

#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?

Ответ №1:

вы можете встроить Env.js в Rhino для получения такого рода функциональности

Ответ №2:

Согласно документации:

Объект window представляет собой открытое окно в браузере.

Поскольку вы не выполняете свой скрипт в браузере, объект window не определен.

Вы можете прочитать URL-адрес, используя классы URL / URLConnecion, и передать его в ScriptEngine. Здесь есть руководство.

Комментарии:

1. Мне нравится ответ, за исключением того, что w3schools — это такая же «документация», как википедия или случайный результат веб-поиска. Итак, первые две строки этого ответа неверны.

2. Я удивлен, что никто не сказал вам использовать JavaFX. Вы можете добиться отсутствия заголовков, используя JFrame.

Ответ №3:

В javascript window означает окно браузера. Итак, когда вы пытаетесь выполнить этот js из Java, он не может найти окно браузера, и вы получаете сообщение об ошибке. Вы можете использовать класс URL в Java, чтобы получить содержимое URL.

Комментарии:

1. На самом деле, содержимое URL-адреса содержит гиперссылки, которые я могу получить только с помощью document.getElementByTagName(‘a’); Поэтому для этого мне нужно загрузить URL-адрес в память, сделать это и получить ссылку

2. вы можете проанализировать строку, используя шаблон регулярного выражения.

3. Ссылка отсутствует в исходном коде страницы. Он загружается 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;
}
  

Комментарии:

1. Проблема в том, что ссылка на странице генерируется javascript. Таким образом, ссылка появится только после загрузки URL-адреса. т.е. ее нет в исходном HTML-файле. Вот почему после загрузки URL я делаю document.getElementByTagName(‘a’) вместо того, чтобы использовать класс URL в Java для извлечения ссылок.

2. URL.openConnection эмулирует то, что делает браузер клиента, поэтому вы получаете точно такую же разметку, которую получаете через браузер. Попробуйте, и я верю, что вы увидите, что это работает. Если у меня ничего не получится, дайте мне знать, что вы получите, и мы могли бы попытаться проработать это дальше.

3. Конечно, сделаю это и расскажу вам.

Ответ №5:

вы можете использовать HtmlUnit — java API, я думаю, это может помочь вам получить доступ к исполняемому контенту js в виде простого html.

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