Выполнение JS в Java JVM с контекстом dom - PullRequest
0 голосов
/ 27 сентября 2019

В настоящее время я работаю над своим небольшим проектом, и я столкнулся с небольшой (или большой) трудностью.

Я пишу программу на Java, которая извлекается из веб-сайта и запускает некоторый код JavaScript.Я использую ScriptEngineManager для запуска кода JavaSript в JVM , но такой код, как document.getInnerHtml().getElementById(), не работает из-за отсутствия доступа к контексту dom.

Можно ли каким-либо образом запустить его?

Ответы [ 2 ]

0 голосов
/ 27 сентября 2019

Ну,

Надеюсь, вы найдете этот ответ "несколько полезным".Я говорю «несколько» в первую очередь потому, что не могу дать полный ответ на ваше затруднительное положение, поскольку я не работал с библиотекой Selenium WebDriver.Я лично написал довольно большой HTML-парсер для поиска и просмотра HTML-страниц.Реальность библиотек Java - библиотек, включенных в выпуски Java от Sun Micro-Systems, - заключается в том, что в их состав не входит «Библиотека выполнения сценариев Java».«ScriptEngineManager» - это пакет, который я никогда раньше не использовал.В мою защиту, есть множество дополнительных библиотек в Java Framework, которые я не кодировал.

Что важно, так это то, что я проделал большую работу по анализу, поиску и копированию HTML, CSS, Java-Script, AJAX в библиотеку Java.Вы можете посмотреть его здесь, и он имеет цель, аналогичную проекту под названием «JSoup», который существует довольно долго, но в нем отсутствуют некоторые из моих функций.(JSoup Scrape Link: JSoup.org и Torello.HTML: developer.torello.directory )

Помощь, которую я могу предоставить, заключается в том, что вам нужно подуматьцель вашего проекта (которая не так хорошо прояснена вашим вопросом!) - чтобы решить, какую из этих дополнительных библиотек вы хотите использовать.

Если вы действительно хотите начать выполнять JavaScript (который яне рекомендуем, если только вам это не нужно), вам необходимо просмотреть «Библиотеки Selenium Web Driver».Эта библиотека на порядок сложнее, и, как правило, если вы просто пытаетесь получить несколько фрагментов данных с веб-сайта, то идете с простым пакетом очистки или гибридом, где вы делаете вызовы Java и что-то вроде «симуляции».«AJAX и JSON обращаются к веб-серверу - это правильная идея.Как правило, толпа Selenium из того, что я видел в SO, обычно больше интересуется автоматизированной публикацией и взаимодействием с веб-сайтами, что требует использования библиотек исполнения Selenium Java-Script.

Если вы просто хотите получить доступ к статическимсодержание вы можете попробовать что-то простое, как в следующем кодеЯ опубликую его, используя Torello.HTML, но, очевидно, вы также можете использовать библиотеку JSOUP.Если вы просто заинтересованы в получении HTML и самого контента и готовы написать Java-код для выполнения любых ваших целей в Java - исключая Java-Script - тогда это должно быть просто замечательно.Опять же, если вы пытаетесь выполнить повторяющиеся запросы, которые взаимодействуют с веб-сервером, и вам обязательно нужно использовать Java-скрипт на этой странице, повторно отправьте свой вопрос и попробуйте задать вопрос об использовании Selenium Web-Driver.

import Torello.HTML.*;
import Torello.HTML.NodeSearch.*;
import Torello.Java.FileRW;

import java.util.*;
import java.io.*;

public class Scrape
{
    public static void main(String[] argv) throws IOException
    {
        String              html        = FileRW.loadFileToString("Example.html");
        Vector<HTMLNode>    page        = HTMLPage.getPageTokens(html, false);
        Vector<HTMLNode>    divContent  = InnerTagGetInclusive.first
                                        (page, "div", "id", TextComparitor.EQ_CI_TRM, "k");
        System.out.println(
                "Entire <DIV ...> Element:\n" + 
                Util.pageToString(divContent) + "\n\n" +
                "DIV Element Contents:\n" + 
                Util.textNodesString(divContent));
    }
}

Вот вывод, сгенерированный описанным выше (кратким) примером поиска и очистки HTML-класса Java:

Entire <DIV ...> Element:
<div style="display:none;visibility:hidden;" id="k">+((!+[]+!![]+!![]+!![]+!![]+!![]+!![]+!![]+[])+(!+[]+!![]+!![])+(!+[]+!![]+!![]+!![]+!![]+!![]+!![]+!![])+(+[])+(!+[]+!![]+!![]+!![])+(+!![])+(!+[]+!![]+!![]+!![]+!![]+!![])+(!+[]+!![]+!![]+!![])+(!+[]+!![]+!![]+!![]+!![]+!![]+!![]))/+((!+[]+!![]+!![]+!![]+[])+(!+[]+!![]+!![]+!![])+(!+[]+!![]+!![]+!![]+!![]+!![])+(!+[]+!![]+!![]+!![]+!![]+!![])+(+!![])+(!+[]+!![]+!![]+!![])+(!+[]+!![])+(!+[]+!![]+!![]+!![]+!![]+!![]+!![]+!![])+(!+[]+!![]))</div>

DIV Element Contents:
+((!+[]+!![]+!![]+!![]+!![]+!![]+!![]+!![]+[])+(!+[]+!![]+!![])+(!+[]+!![]+!![]+!![]+!![]+!![]+!![]+!![])+(+[])+(!+[]+!![]+!![]+!![])+(+!![])+(!+[]+!![]+!![]+!![]+!![]+!![])+(!+[]+!![]+!![]+!![])+(!+[]+!![]+!![]+!![]+!![]+!![]+!![]))/+((!+[]+!![]+!![]+!![]+[])+(!+[]+!![]+!![]+!![])+(!+[]+!![]+!![]+!![]+!![]+!![])+(!+[]+!![]+!![]+!![]+!![]+!![])+(+!![])+(!+[]+!![]+!![]+!![])+(!+[]+!![])+(!+[]+!![]+!![]+!![]+!![]+!![]+!![]+!![])+(!+[]+!![]))
0 голосов
/ 27 сентября 2019

Итак, вот пример

 <!DOCTYPE HTML>
<html lang="en-US">
<head>
  <meta charset="UTF-8" />

    <script type="text/javascript">
  
      var a = document.getElementById('k');
     
</script>


</head>
<body>
  <div style="display:none;visibility:hidden;" id="k">+((!+[]+!![]+!![]+!![]+!![]+!![]+!![]+!![]+[])+(!+[]+!![]+!![])+(!+[]+!![]+!![]+!![]+!![]+!![]+!![]+!![])+(+[])+(!+[]+!![]+!![]+!![])+(+!![])+(!+[]+!![]+!![]+!![]+!![]+!![])+(!+[]+!![]+!![]+!![])+(!+[]+!![]+!![]+!![]+!![]+!![]+!![]))/+((!+[]+!![]+!![]+!![]+[])+(!+[]+!![]+!![]+!![])+(!+[]+!![]+!![]+!![]+!![]+!![])+(!+[]+!![]+!![]+!![]+!![]+!![])+(+!![])+(!+[]+!![]+!![]+!![])+(!+[]+!![])+(!+[]+!![]+!![]+!![]+!![]+!![]+!![]+!![])+(!+[]+!![]))</div>
  


</body>
</html>

Итак, моя java-программа попытается запустить этот код "document.getElementById ('k')", но он не увидит, где находится этот HTML-div, поэтомуthrow документ не определен.

Итак, в Java есть ScriptEngineManager, который может позволить вам проверить код Javascript, но у него не будет доступа к HTML-документу, поэтому он не будет работать для кода, подобного этому.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...