JSOUP не совместим с JS - получение пустых HTML -элементов - PullRequest
0 голосов
/ 14 апреля 2020

В Java Я подключаюсь к веб-сайту и запрашиваю документ HTML:

public void anyAction() {
        new HttpThread().start();
}
class HttpThread extends Thread {
        public void run() {
            try {
                String url = "http://example.com/something" //this is a dummy. You can´t access the real website without a VPN
                Document doc = Jsoup.connect(url)
                                    .timeout(30000)
                                    .get();
                // rest of the code
            }
            catch (IOException e) {
                // print e.toString()
                throw new RuntimeException(e);
            }
        }
}

Это запрашиваемый HTML -код сайта, который включает в себя: бит javascript:

<html><head>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>This is the title</title>
        <link rel="stylesheet" type="text/css" href="css/style.css">        
        <script type="text/javascript" src="lib/jquery-1.2.min.js"></script>    
        <script type="text/javascript" src="lib/moment-with-locales.min.js"></script>


    </head>

    <body>
        <table class="header">
            <tbody><tr>
                <td>
                    <div id="attr1" class="attr1"><div class="test">something</div></div>
                </td>
            </tr>   
        </tbody></table>
        <div id="attr2" class="attr2" style="visibility: hidden;">something</div>
        <div id="attr3" class="attr3" style="visibility: hidden;">something</div>
        <div id="attr4" class="attr4" style="visibility: hidden;">something</div>
        <div id="attr5" class="attr5" style="visibility: hidden;">something</div>
        <div id="attr6" class="attr6" style="visibility: hidden;">something</div>
        <div id="attr7" class="info">something</div>
        <div id="attr8" class="attr8" style="visibility: visible;">something</div>

        <script language="javascript">

            function getParam ( strParamName ) {
                strParams = document.location.search.substring ( 1 , document.location.search.length );
                varParams = strParams.split ( '&' );
                for (var intPos = 0; intPos < varParams.length; ++intPos ) {
                    varParam = varParams[intPos].split ( '=' );
                    if ( varParam[0] == strParamName ) {
                        return varParam[1];
                    }
                }
            }


            function loadData (url) {
                var mydata = null;
                $.ajax({
                    url: url,
                    async: false,
                    dataType: 'json',
                    cache: false,
                    success: function (json) {
                        mydata = json;                  ;
                    },
                    error: function () {
                        mydata = null;
                    }
                });

                return mydata;  
            }

            function initialize () {                

                display = new Object();             
                refreshRoomInfos();                         
                insertData();
                timer = window.setInterval ( "insertData()" , 30000 );
                timer = window.setInterval ( "refreshRoomInfos()" , 60000 );

            }

            function refreshRoomInfos() {

                var displayId = getParam('displayId');
                var virtualNowDate = getParam('virtualNowDate');
                var preview = getParam('preview');
                var roomRestUrl;

                if (typeof displayId === "undefined" || displayId === "") {                 
                    roomRestUrl = '../rest/displayService/get/rooms?roomId=' + getParam('roomId');
                } else {
                    roomRestUrl = '../rest/displayService/get/rooms?displayId=' + displayId;                    
                }

                roomData = loadData(roomRestUrl);
                if (typeof roomData !== "undefined" && roomData != null) {
                    var room = roomData[0]; 

                    if (typeof room !== "undefined" && room != null) {
                        var attr1 =  room.displayName;              
                        if (typeof attr1 === "undefined" || attr1 === "") {                     
                            attr1 = room.name;                                      
                        }
                        display.roomId = room.id;        
                        fillHTML('room', "<div class=\"test\">" + attr1 + "</div>");

                        if (typeof room.additionalDisplayText !== "undefined" && room.additionalDisplayText != null) {
                            fillHTML('attr7', room.additionalDisplayText);
                        }    
                    }
                }
            }

            function insertData() {
                if (typeof display.roomId !== "undefined") {

                        + "&virtualNowDate=" + virtualNowDate
                        + "&preview=" + preview

                    var apptURL = '../rest/displayService/get/appointments/' + display.roomId + '/50?displayFlag=false';
                    var virtualNowDate = getParam('virtualNowDate');
                    if(virtualNowDate){
                        apptURL += "&virtualNowDate=" + virtualNowDate;
                    }
                    var preview = getParam('preview');
                    if(preview){
                        apptURL += "&preview=" + preview;
                    }
                    var appointments = loadData(apptURL);
                    var appointment = getCurrentAppointment(appointments);              
                    if (appointment != null)  {

                        setVisibleHTML('attr2', 'visible');
                        setVisibleHTML('attr5', 'visible');
                        setVisibleHTML('attr6', 'visible');
                        setVisibleHTML('attr3', 'visible');
                        setVisibleHTML('attr4', 'visible');
                        setVisibleHTML('attr8', 'hidden');

                        var belosEvent = appointment.event;

                        // Titel des Appointments
                        var title = appointment.displayTitle;
                        if (typeof title === "undefined"
                                || title === "") {
                            title = belosEvent.attr4;

                            if (typeof appointment.subattr4 !== "undefined" && appointment.subattr4 !== ""
                                    && appointment.subattr4 !== title) {
                                title += " - " + appointment.subattr4;
                            }
                        }

                        // Startdatum des Appointments
                        var dateFrom = moment(appointment.startDate).toDate();
                        var dateFromString =
                                dateFrom.getHours()
                                + ":"
                                + (dateFrom.getMinutes().toString().length === 1 ? "0" + dateFrom.getMinutes() : dateFrom.getMinutes());
                        // Enddatum des Appointments
                        var dateTo = moment(appointment.endDate).toDate();
                        //    dateTo.setTime(appointment.endDate);
                        var dateToString =
                                dateTo.getHours()
                                + ":"
                                + (dateTo.getMinutes().toString().length === 1 ? "0" + dateTo.getMinutes() : dateTo.getMinutes());
                        //falls mehrtägiger Termin
                        if(!(dateFrom.getDate()===dateTo.getDate()&&dateFrom.getMonth()===dateTo.getMonth()&&dateFrom.getFullYear()===dateTo.getFullYear())){
                            //falls Date-Parameter über URL übergeben wurde
                            if(paramD!==null&&paramD!==undefined){
                                //falls heute nicht zwischen Terminbeginn und Terminende oder nicht der der letzte Tag des mehrtägigen Termins ist
                                if(!((!(now.getDate()===dateFrom.getDate()&&now.getMonth()===now.getMonth()&&now.getFullYear()===dateFrom.getFullYear())&&
                                        !(now.getDate()===dateTo.getDate()&&now.getMonth()===dateTo.getMonth()&&now.getFullYear()===dateTo.getFullYear)&&
                                        dateFrom.getTime()<now.getTime()&&now.getTime()<dateTo.getTime())||
                                        now.getDate()===dateTo.getDate()&&now.getMonth()===dateTo.getMonth()&&now.getFullYear()===dateTo.getFullYear())){
                                    now = paramD;
                                }
                            }
                            //falls heute erster Tag, dann behalte Startuhrzeit bei, ansonsten setze sie auf 00:00
                            dateFromString = dateFrom.getDate()===now.getDate()&&dateFrom.getMonth()===now.getMonth()&&dateFrom.getFullYear()===now.getFullYear() ? dateFromString : "00:00";
                            //falls heute letzter Tag, dann behalte Enduhrzeit bei, ansonsten setze sie auf 23:59
                            dateToString = dateTo.getDate()===now.getDate()&&dateTo.getMonth()===now.getMonth()&&dateTo.getFullYear()===now.getFullYear() ? dateToString : "23:59";
                        }

                        // Organisator des Appointments
                        var attr6 = belosEvent.attr6.lastname;
                        if (typeof belosEvent.attr6.firstname !== "undefined"
                                && belosEvent.attr6.firstname !== "") {
                            attr6 += ", " + belosEvent.attr6.firstname;
                        }
                        if (belosEvent.attr6.lastname === "System"
                                && belosEvent.attr6.firstname === "System") {
                            attr6 = null;
                        }

                        fillHTML('attr2', dateFromString + " - " + dateToString + " Uhr");

                        fillHTML('attr6', attr6);
                        fillHTML('attr4', title);

                    } else {
                        setVisibleHTML('attr2', 'hidden');
                        setVisibleHTML('attr5', 'hidden');
                        setVisibleHTML('attr6', 'hidden');
                        setVisibleHTML('attr3', 'hidden');
                        setVisibleHTML('attr4', 'hidden');
                        setVisibleHTML('attr8', 'visible');

                    }   
                }               
            }

            function setVisibleHTML(fieldId, visible) {
                //alert(fieldId);
                var elem = document.getElementById(fieldId);                
                elem.style.visibility = visible;
            }

            function fillHTML(fieldId, value) {             
                var elem = document.getElementById(fieldId);                
                elem.innerHTML = value;
            }

            function getCurrentAppointment(appointments) {
                var appointment = null;
                var now = new Date();   
                var virtualNowDate = getParam('virtualNowDate');
                if(virtualNowDate){
                    now = virtualNowDate;
                }
                console.log("virtualNowDate " + virtualNowDate);
                console.log("NOW " + now);
                if (appointments != null && appointments.length > 0) {
                    console.log("appointments not null and length > 0 ");
                    for (var i = 0; i < appointments.length; i++) {
                        appointment =  appointments[i];                     
                        if (appointment != null && now <= moment(appointment.endDateWaiting).toDate()) {
                            return appointment;
                        }
                        appointment = null;
                    }                               
                }
                return appointment;
            }

            initialize();

        </script>




</body></html>

затем я извлекаю текстовое содержимое элементов по их id attr1 - attr8:

doc.select("div[id=attr1]").text();

Это работает для attr1, attr3, attr5 и attr8.

Проблема в том, что текстовое содержимое, которое я получаю от attr2, attr4, attr6 и attr7, является пустым. Так не должно быть, потому что они не пустые, когда я открываю сайт в своем веб-браузере. Я предполагаю, что это связано с частью javascript в HTML -коде, поскольку JSOUP не совместим с javascript. Любые предложения о том, как решить эту проблему?

1 Ответ

0 голосов
/ 14 апреля 2020

HTML, который возвращается с URL: "http://example.com/something", то есть URL, который назван в вашем коде, выглядит следующим образом: ОБА в моей Google-Chrome сети -браузер 'View-Source' окно, И в моем скачанном извлеченном файле HTML out.html.

ПРЕДЛОЖЕНИЕ: Пожалуйста обновите свой код так, чтобы HTML, который вы указали / предоставили, соответствовал HTML, который может быть получен с URL-адреса, указанного в коде вашего вопроса.

<!DOCTYPE html><html><head>
    <title>Example Domain</title>

    <meta charset="utf-8">
    <meta http-equiv="Content-type" content="text/html; charset=utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <style type="text/css">
    body {
        background-color: #f0f0f2;
        margin: 0;
        padding: 0;
        font-family: -apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", "Open Sans", "Helvetica Neue", Helvetica, Arial, sans-serif;

    }
    div {
        width: 600px;
        margin: 5em auto;
        padding: 2em;
        background-color: #fdfdff;
        border-radius: 0.5em;
        box-shadow: 2px 3px 7px 2px rgba(0,0,0,0.02);
    }
    a:link, a:visited {
        color: #38488f;
        text-decoration: none;
    }
    @media (max-width: 700px) {
        div {
            margin: 0 auto;
            width: auto;
        }
    }
    </style>    
</head>

<body>
<div>
    <h1>Example Domain</h1>
    <p>This domain is for use in illustrative examples in documents. You may use this
    domain in literature without prior coordination or asking for permission.</p>
    <p><a href="https://www.iana.org/domains/example">More information...</a></p>
</div>


</body></html>

Просто чтобы указать, что он по-видимому, не имеет ни одного из элементов HTML делителя (и, следовательно, атрибутов 'attr1'), которые вы ищете. Возможно, вы ввели неправильный URL?

...