HTTP Interpretierten Seitenquellcode anzeigen

Nemesys88

Bekanntes Mitglied
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.
 

Flown

Administrator
Mitarbeiter
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.
 

Thallius

Top Contributor
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.
 

Nemesys88

Bekanntes Mitglied
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.
 

Nemesys88

Bekanntes Mitglied
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.
 

JCODA

Top Contributor
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".
 

Nemesys88

Bekanntes Mitglied
Funktioniert leider nicht...
Ich versuche mal mit dem Word-Export zu arbeiten, da steht wenigstens der komplette Seitenquellcode drin.
Danke erstmal.
 

mihe7

Top Contributor
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.
 

Nemesys88

Bekanntes Mitglied
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

  • conf_temp.png
    conf_temp.png
    28,3 KB · Aufrufe: 145
  • conf_div.png
    conf_div.png
    11,2 KB · Aufrufe: 145

httpdigest

Top Contributor
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:
nFGsT6S.png

Außerdem musst du dich höchstwahrscheinlich auch als angemeldet/authentifiziert ausgeben, sonst erhältst du sicherlich eine Anmeldemaske als Ergebnis.
 

mihe7

Top Contributor
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.
 

Nemesys88

Bekanntes Mitglied
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?
 

httpdigest

Top Contributor
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?
Wenn du dich einloggst, bekommst du im Response einen Set-Cookie Header (enthält eine CONFLUENCESESSIONID), den du als "Cookie"-Header im nächsten Request mitsenden musst. Schaue dir in den F12-Tools einfach an, was im /dologin.action Request als Response zurückkommt.
 

Nemesys88

Bekanntes Mitglied
Läuft!

Java:
        driver.findElement(By.id("os_username")).sendKeys("xxx");
        driver.findElement(By.id("os_password")).sendKeys("xxx");
        driver.findElement(By.id("loginButton")).click();

Herzliches DANKESCHÖN an Alle! :)
 

mihe7

Top Contributor
Noch ein Hinweis: Du musst nicht über die content-id gehen, sondern kannst Dir die Elemente, die Du brauchst, z. B. auch direkt per XPath oder CSS-Selektor rauslesen. Dann brauchst Du kein HTML zu parsen.
 

Nemesys88

Bekanntes Mitglied
Ok, danke für den Tipp, kann ich nochmal versuchen! Das Parsen war jetzt aber nicht das Problem, mit:
Java:
        String content = driver.findElement(By.id("main-content")).getAttribute("innerHTML"); 
        driver.close();       
        List<String> allMatches = new ArrayList<>();
        Matcher m = Pattern.compile("[>][A-Z_-]{2,}[<]") //$NON-NLS-1$
            .matcher(content);
hatte ich das, was ich brauchte, zusammen. =)
 

sascha-sphw

Top Contributor
Das was du beschreibst geht hervorragend mit der RestAPI, habe ich selber schon mal für ein Projekt umgesetzt. Natürlich musst Du dann immer noch HTML parsen und dir deine Elemente entsprechend suchen. Der große Vorteil dabei ist aber, es sind reine Daten ohne JavaScript.
 

Nemesys88

Bekanntes Mitglied
Hallo zusammen!

Ich verwende mal meinen alten Thread wieder.

Ich möchte jetzt gerne, den Seiteninhalt der Confluence-Seite verändern.
Dabei komme ich soweit bis zur Bearbeitung, aber das mit dem Speichern klappt noch nicht.
Also erstmal Code:

Java:
            JavascriptExecutor js = (JavascriptExecutor) driver;
            new Actions(driver).sendKeys("e").perform(); //$NON-NLS-1$
            new WebDriverWait(driver, 20).until(new ExpectedCondition<Boolean>() {
                @Override
                public Boolean apply(WebDriver d) {
                   return driver.findElement(By.id("wysiwygTextarea")).isDisplayed();  //$NON-NLS-1$
                }
            });
            js.executeScript("var ele=arguments[0]; ele.innerHTML += 'Seiteneigenschaften';", driver.findElement(By.id("wysiwygTextarea"))); //$NON-NLS-1$ //$NON-NLS-2$
            driver.findElement(By.id("qed-publish-button")).click(); //$NON-NLS-1$

Also eigentlich geht es darum, dass das Ganze in mehreren Schleifen läuft und ich bei ca. 2000 einzelnen Seiten, das Confluence-Seiteneigenschaften-Makro einbauen möchte.

Dabei habe ich folgende 2 Probleme:

a) Weiss ich nicht, wie ich das mit dem Makro so schreiben muss, dass er IN das Makro das jetzige "ele.innerHTML" einbettet.
b) funktioniert auch das einfache Hinzufügen eines Textes so wie im Code oben zu sehen, noch nicht. Man sieht dem ChromeDriver aber auch nicht an, dass er da Text hinzufügt. Auch vom Buttonklick sieht man nichts...

Würde mich über Hilfe sehr freuen.

MfG
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
kodela StatusBar-Anzeigen auch in Log-Datei ausgeben Allgemeine Java-Themen 3
berserkerdq2 Text über einen Shape anzeigen (Scenebuilder) Allgemeine Java-Themen 1
C Kalender mit Tageswerten anzeigen Allgemeine Java-Themen 23
W Datum anzeigen Allgemeine Java-Themen 10
OnDemand Anzeigen was eine Applikation macht Allgemeine Java-Themen 1
Lukas2904 Swing Anzeigen lassen das das Programm geschlossen wurde Allgemeine Java-Themen 3
Lukas2904 Wie kann man cps (ClicksPerSecond) in einer GUI anzeigen lassen? Allgemeine Java-Themen 4
I if-eingaben nur einmal anzeigen Allgemeine Java-Themen 6
B Long in einen Double umwandeln und im Label anzeigen Allgemeine Java-Themen 7
L Tess4j Umlaute anzeigen Allgemeine Java-Themen 3
N Daten einer JCoTable in JTextArea anzeigen Allgemeine Java-Themen 7
M Java- Bild gewissen Anzahl von Sekunden anzeigen?! Allgemeine Java-Themen 4
M Java (GUI) Code verdoppeln oder anzeige mehrmals anzeigen? Allgemeine Java-Themen 8
E Swing Interaktive Flächen auf der GUI anzeigen lassen Allgemeine Java-Themen 5
P GUI: ArrayList anzeigen funktioniert nicht Allgemeine Java-Themen 5
A Swing Immer aktuelle Mausposition anzeigen lassen Allgemeine Java-Themen 7
O Threads Aktivität anzeigen... Allgemeine Java-Themen 5
P jCheckBox auf der zusammengeknüpften Programmierung anzeigen lassen Allgemeine Java-Themen 3
0 Animiertes Gif anzeigen - NullPointer Exception Allgemeine Java-Themen 19
M Abonnentenzahl, Aufrufe, etc. von einem YouTube-Kanal anzeigen Allgemeine Java-Themen 7
L Verklemmungen Anzeigen Allgemeine Java-Themen 8
H JFileChooser soll NUR Windows-Netzwerkumgebung anzeigen Allgemeine Java-Themen 2
I JTextArea soll nur drei Zeilen anzeigen Allgemeine Java-Themen 1
B Erste Schritte Plugin erkennen und Class Dateien anzeigen lassen Allgemeine Java-Themen 3
T Wie kann ich alle existierenden Java-Klassen anzeigen lassen? Allgemeine Java-Themen 10
S BLOB Image in JSP anzeigen Allgemeine Java-Themen 5
P "virus entschärfen" / cpu-auslastung von javaw.exe anzeigen Allgemeine Java-Themen 9
W JavaDoc Runtime-Exceptions: Wie sinnvoll anzeigen? Allgemeine Java-Themen 14
P Font aus PDF extrahieren -> im Panel anzeigen Allgemeine Java-Themen 3
M CMD-Text anzeigen Allgemeine Java-Themen 10
M Chart per byte[] in JSP anzeigen Allgemeine Java-Themen 4
R Referenzen im Heap anzeigen Allgemeine Java-Themen 3
D Player Objekt - Frame über Server anzeigen lassen. Allgemeine Java-Themen 3
C Zahl im Textarea anzeigen lassen Allgemeine Java-Themen 8
H Grafikfenster beim booten anzeigen Allgemeine Java-Themen 2
Z Socket [Chatprogramm] Nachrichten vom Server anzeigen lassen Allgemeine Java-Themen 6
Z Desktop anzeigen + Screenshot klappt nicht Allgemeine Java-Themen 3
C Verschlüsselte JPEG Datei anzeigen Allgemeine Java-Themen 10
S TextDatei in Panel anzeigen Allgemeine Java-Themen 10
E 2D-Grafik nicht-rechteckige Grafik anzeigen Allgemeine Java-Themen 3
M Anzeigen Blob gespeicherte Datei Allgemeine Java-Themen 6
J System.out im GUI anzeigen Allgemeine Java-Themen 3
D Bilder in JFrame anzeigen Allgemeine Java-Themen 5
P Swing GUI Process anzeigen Allgemeine Java-Themen 10
cedi Eingegebenen Text in der Konsole nicht sichtbar machen oder nur in Sternchen anzeigen Allgemeine Java-Themen 2
K Liste aller implementierenden Klassen einer Oberklasse anzeigen Allgemeine Java-Themen 4
S Graphik anzeigen Allgemeine Java-Themen 9
B Applet .java Datei einlesen, anzeigen Allgemeine Java-Themen 3
destroflyer *.dds-Bild anzeigen Allgemeine Java-Themen 12
S Inhalt einer zip-Datei anzeigen Allgemeine Java-Themen 11
S Probleme beim Anzeigen des Dateiinhalts Allgemeine Java-Themen 6
T Zeit von einem Server/Webseite auslesen und in eigener GUI anzeigen Allgemeine Java-Themen 6
ARadauer JFreeChart: Beschriftung anzeigen Allgemeine Java-Themen 6
Benji0815 Verzeichnis wie im Windows Explorer in einem JTree anzeigen Allgemeine Java-Themen 6
M Java PDF Anzeigen Allgemeine Java-Themen 5
M Arraylist - Inhalte in Textferldern anzeigen, verändern und löschen. Allgemeine Java-Themen 18
A Zeichen beim Eingeben in ein DOS-Fenster nicht anzeigen? Allgemeine Java-Themen 3
H2SO3- txt datei anzeigen Allgemeine Java-Themen 4
A zwei listen vergleichen und unterschiede anzeigen Allgemeine Java-Themen 3
J Ergebnismenge eines SQL-Queries in JTable anzeigen Allgemeine Java-Themen 3
W Windows XP: ProcessBuilder.start: Kommandoshell anzeigen Allgemeine Java-Themen 3
J Process auf Console anzeigen lassen. Allgemeine Java-Themen 5
Y JasperReport - PDF sofort anzeigen Allgemeine Java-Themen 4
G Bilder einer Webcam im JFrame anzeigen Allgemeine Java-Themen 5
A Noch freie Nummern anzeigen lassen Allgemeine Java-Themen 3
G Taskmanager, Leistung anzeigen Allgemeine Java-Themen 61
B Externes Programm starten - Konsolenausgabe anzeigen lassen? Allgemeine Java-Themen 2
J JSP, Link nur bei erfüllter Bedingung anzeigen Allgemeine Java-Themen 6
G Wait_Cursor anzeigen Allgemeine Java-Themen 4
Zed JList Object einfügen und Text anzeigen Allgemeine Java-Themen 3
D Suche Programm, zum anzeigen von Threads und JVM Zustand etc Allgemeine Java-Themen 8
G Ausgeführtes PreparedStatement anzeigen Allgemeine Java-Themen 3
E *.gif anzeigen Allgemeine Java-Themen 2
V Java applets unter ubuntu im Browser anzeigen Allgemeine Java-Themen 9
T Countdown -> Sekunden anzeigen Allgemeine Java-Themen 4
G mehrer grafiken mit delay daziwschen anzeigen Allgemeine Java-Themen 5
D Flackern beim Anzeigen von Daten mit einer JdbTable Allgemeine Java-Themen 3
I Anzeigen der Zeitzone Allgemeine Java-Themen 2
P Fortschrittszustand von gezippten Files anzeigen Allgemeine Java-Themen 6
G Batch-Datei - javac Ausgaben anzeigen Allgemeine Java-Themen 5
T Prozessliste anzeigen? Allgemeine Java-Themen 2
S JPanel zur Laufzeit verbergen bzw. wieder anzeigen lassen Allgemeine Java-Themen 4
T JEditorPane oder JTextPane Applets und Flash anzeigen Allgemeine Java-Themen 7
M Wie kann ich Hexzahl umwandeln und den String anzeigen? Allgemeine Java-Themen 4
G Panel einer Klasse in einer anderen anzeigen Allgemeine Java-Themen 4
P Inhalt einer Mail anzeigen Allgemeine Java-Themen 5
G Inhalt von Servern anzeigen lassen Allgemeine Java-Themen 9
G String farbig anzeigen. WIE? Allgemeine Java-Themen 4
bernd Unterschiede von Ordnerstrukturen in JTextArea anzeigen Allgemeine Java-Themen 4
I Startbild anzeigen während JVM geladen wird Allgemeine Java-Themen 5
G Escape-Sequenzen anzeigen Allgemeine Java-Themen 11
L Windows-Fenster "Arbeitsplatz" anzeigen Allgemeine Java-Themen 13
A Programm in der Taskleiste anzeigen lassen Allgemeine Java-Themen 3
S Word-Dokument in Textarea anzeigen Allgemeine Java-Themen 2

Ähnliche Java Themen

Neue Themen


Oben