HTTP Interpretierten Seitenquellcode anzeigen

Bitte aktiviere JavaScript!
Hallo zusammen!

Ich möchte mir gerne mit JSoup den Seitenquelltext einer Website holen.
Leider habe ich dabei das Problem, dass genau das div, das ich brauche,
über Javascript gesteuert wird...
Lasse ich mir den Quelltext mit Chrome anzeigen, sehe ich aber zb. den Inhalt des Divs -
Chrome scheint hier den bereits interpretierten Quelltext anzuzeigen.
Geht das auch irgendwie programmatisch?

Wichtiger Hinweis: Es handelt sich um eine Confluence - Seite.

Mein Aufruf startet ca. so:

Java:
                Document doc = Jsoup
                        .connect("https://confluence....")
                        .userAgent("Chrome/60.0.3112.113")
                        .get();
Habe da schon mit userAgent etc. probiert, was mich aber nicht weitergebracht hat...
Auch andere Verfahren, um eine Website per Java auszulesen habe ich probiert, Scanner u.v.m.
Aber die zeigen mir alle nicht den vollständig interpretierten Code an.

Was kann ich tun?

Vielen Dank.
 
Da JSoup nur ein HTML parser ist und keine Browserengine. Verwende doch Selenium. Mit dem passendem WebDriver. Dann kannst du bequem die gerenderte Seite parsen.
 
Wenn die Seite serverseitig erzeugt wird bekommst du den "echten" Quelltext natuerlich nicht sondenr immer schon die aufbereitete Seite. Wenn Du also wissen willst wie die etwas berechnen oder so, dann bleibt das deren Geheimnis.
 
Habe es jetzt mit Selenium probiert, allerdings mit dem gleichen Ergebnis, dass ich das von mir gewünschte div nicht sehe. Code dazu sieht so aus, aber evtl ist hier auch etwas falsch.. ?!

Java:
            System.setProperty("webdriver.chrome.driver", "C:/ams/chrome/chromedriver.exe");
            WebDriver browser = new ChromeDriver();
            browser.get("https://confluence.servicedesk...");
            System.out.println(browser.getPageSource());
            browser.close();
// Ja, Rest-API habe ich auch schon versucht, auch da das gleiche Ergebnis.
 
Nein, nur Rechtsklick und Seitenquelltext anzeigen und dann runterscrollen ;)
Sehe das auch nur in Chrome, in anderen Browsern nicht.

Ich weiss nicht, ob das hilft, aber das Div fängt so an:

Java:
        <div id="main-content" class="wiki-content">
                         
        <p><ul class="childpages-macro conf-macro output-block" data-hasbody="false" data-macro-name="children">
dann kommen ganz viele <li> ...

und am Ende wird es so geschlossen:

Java:
</ul><span class="confluence-anchor-link conf-macro output-inline" id="xxx" data-hasbody="false" data-macro-name="anchor"> </span></p>

        </div>
Und im Prinzip geht es mir darum, dass ich (den Inhalt) der li's brauche.
 
Bau mal ein Thread.sleep(3); nach dem get ein. Kommt nun das erwartete Ergebnis?
Ansonsten kannst du mal nach WebDriverWait googlen, damit kannst du auf bestimmte Dinge "warten".
 
Funktioniert leider nicht...
Ich versuche mal mit dem Word-Export zu arbeiten, da steht wenigstens der komplette Seitenquellcode drin.
Danke erstmal.
 
Das mit dem Warten sollte schon funktionieren. Vielleicht reichen aber 3 Sekunden nicht aus: mir fällt spontan keine Web-Anwendung ein, bei der das Ressourcen/Leistungsverhältnis von Confluence/Jira übertroffen wird.
 
Okay, ist leider ein bisschen schwer ohne Screenshots machen zu können (wegen Firmeninterna etc.), aber ich deute es einfach mal an (siehe Anhang).
Wer Confluence kennt, erkennt bestimmt, dass da wo das große X ist der Seiteninhalt steht.
In meinem Fall handelt es sich um eine Liste von Links zu Unterseiten, aber das ist ja eigentlich egal.
Zzt. muss ich diese Liste händisch per Copy&Paste in eine lokale Datei kopieren, um sie von dort aus weiterverarbeiten zu können, was logischerweise unbefriedigend ist...
Deswegen wollte ich gerne über den Seitenquelltext an den Seiteninhalt kommen.
Gehe ich (funktioniert nur im Chrome) mit Rechtsklick auf "Seitenquelltext anzeigen" und scrolle etwas runter, sehe ich den vollständigen Div (siehe conf_div) mit dem kompletten Inhalt. (Also da wo ich die Punkte angedeutet habe sieht man den vollständigen (HTML-) Inhalt)
Hole ich mir den Seitenquelltext aber über.. Jsoup, Selenium, Conf-REST, Scanner, (...) dann bekomme ich nicht den gesamten Quelltext, den ich zb. im Chrome sehe...

Ich hoffe, man kann jetzt etwas Besser verstehen, was ich gerne haben möchte... ;-)
 

Anhänge

Was dir der Webserver (bzw. Confluence) genau sendet, hängt auch davon ab, welche Request Header du beim Request mitsendest. Also, was du als Content-Type akzeptierst und häufig auch, welchen User-Agent du verwendest.
Schaue mal ganz genau in den F12-Tools von Chrome bei dem Request auf die Hauptseite, welche Header mitgesendet werden, und verwende exakt dieselben Header.
Sollte in etwa so aussehen:

Außerdem musst du dich höchstwahrscheinlich auch als angemeldet/authentifiziert ausgeben, sonst erhältst du sicherlich eine Anmeldemaske als Ergebnis.
 
Java:
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.support.ui.ExpectedCondition;
import org.openqa.selenium.support.ui.WebDriverWait;

public class Test {
    public static void main(String[] args) {
        WebDriver driver = new FirefoxDriver();
        driver.get("https://apereo.atlassian.net/wiki/spaces/LIC/pages/103503027/maven-notice-plugin");
        new WebDriverWait(driver, 20).until(new ExpectedCondition<Boolean>() {
            public Boolean apply(WebDriver d) {
                return d.getTitle().toLowerCase().startsWith("maven");
            }
        });
      
        System.out.println(driver.findElement(By.id("content-body")).getAttribute("innerHTML"));

      
    }
}
Funktioniert bei mir einwandfrei.
 
Jaaa... das sieht schon sehr gut aus, den Inhalt bekomme ich schon.
Musste allerdings ChromeDriver nehmen:

Java:
        System.setProperty("webdriver.chrome.driver","D:/chromedriver.exe");
        WebDriver driver = new ChromeDriver();
        driver.get("https://confluence.servicedesk-....");
        new WebDriverWait(driver, 20).until(new ExpectedCondition<Boolean>() {
            @Override
            public Boolean apply(WebDriver d) {
               return d.getTitle().startsWith("Lokale");
            }
        });
    
        System.out.println(driver.findElement(By.id("main-content")).getAttribute("innerHTML"));
Jetzt habe ich nurnoch das "Problem", dass ich beim "Betreten" der Seite händisch die Login-Daten eingeben muss - hat da nochmal jemand einen Tipp?
 
Passende Stellenanzeigen aus deiner Region:

Neue Themen

Oben