Le contenu de la Page est chargé avec javascript et Jsoup ne le voit pas

un bloc sur la page est rempli de contenu par javascript et après avoir chargé la page avec Jsoup il n'y a aucune de cette inforamtion. Y a-t-il un moyen d'obtenir aussi javascript le contenu généré lors de l'analyse de la page avec Jsoup ?

UPD spécial pour Marcin:

Ne peut pas coller le code de la page ici, car il est trop long: http://pastebin.com/qw4Rfqgw

Voici élément de contenu dont j'ai besoin: <div id='tags_list'></div>

je dois obtenir cette information en Java. Preferebaly en utilisant Jsoup. Element is field à l'aide de javascript :

<div id="tags_list">
    <a href="/tagsc0t20099.html" style="font-size:14;">разведчик</a>
    <a href="/tagsc0t1879.html" style="font-size:14;">Sr</a>
    <a href="/tagsc0t3140.html" style="font-size:14;">стратегический</a>
</div>

code Java:

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

import java.io.IOException;

public class Test
{
    public static void main( String[] args )
    {
        try
        {
            Document Doc = Jsoup.connect( "http://www.bestreferat.ru/referat-32558.html" ).get();
            Elements Tags = Doc.select( "#tags_list a" );

            for ( Element Tag : Tags )
            {
                System.out.println( Tag.text() );
            }
        }
        catch ( IOException e )
        {
            e.printStackTrace();
        }
    }
}
24
demandé sur Lonely Neuron 2011-09-20 21:01:18

6 réponses

JSoup est un HTML parser, pas une sorte de moteur de navigateur intégré. Cela signifie qu'il n'est absolument pas au courant d'un contenu qui est ajouté au DOM par Javascript après le chargement de la page initiale.

pour accéder à ce type de contenu, vous aurez besoin d'un composant de navigateur intégré, Il ya un certain nombre de discussions sur SO concernant ce type de Composant, par exemple est-il un moyen d'intégrer un navigateur en Java?

17
répondu fvu 2017-05-23 12:10:39

résolu dans mon affaire avec com.codeborne.phantomjsdriver REMARQUE: il est groovy code.

pom.xml

        <dependency>
          <groupId>com.codeborne</groupId>
          <artifactId>phantomjsdriver</artifactId>
          <version> <here goes last version> </version>
        </dependency>

PhantomJsUtils.groovy

import org.jsoup.Jsoup
import org.jsoup.nodes.Document
import org.openqa.selenium.WebDriver
import org.openqa.selenium.phantomjs.PhantomJSDriver

class PhantomJsUtils {
    private static String filePath = 'data/temp/';

    public static Document renderPage(String filePath) {
        System.setProperty("phantomjs.binary.path", 'libs/phantomjs') // path to bin file. NOTE: platform dependent
        WebDriver ghostDriver = new PhantomJSDriver();
        try {
            ghostDriver.get(filePath);
            return Jsoup.parse(ghostDriver.getPageSource());
        } finally {
            ghostDriver.quit();
        }
    }

    public static Document renderPage(Document doc) {
        String tmpFileName = "$filePath${Calendar.getInstance().timeInMillis}.html";
        FileUtils.writeToFile(tmpFileName, doc.toString());
        return renderPage(tmpFileName);
    }
}

Classeinproject.groovy

Document doc = PhantomJsUtils.renderPage(Jsoup.parse(yourSource))
13
répondu iluhin 2017-10-12 10:45:41

vous devez comprendre ce qui se passe:

  • lorsque vous interrogez une page d'un site web, que vous utilisiez Jsoup ou votre navigateur, ce qui vous est renvoyé est du HTML. Jsoup est capable d'analyser.
  • cependant, la plupart des sites web incluent Javascript dans ce HTML, ou lié à partir de ce HTML, qui remplira la page de contenu. Votre navigateur est capable d'exécuter le Javascript, et ainsi peupler la page. Jsoup ne l'est pas.

la façon de comprendre ceci est la suivante : l'analyse du code HTML est facile. L'exécution du code Javascript et la mise à jour du code HTML correspondant est beaucoup plus complexe, et est le travail d'un navigateur.

, Voici quelques solutions pour ce genre de problèmes:

  1. si vous pouvez trouver quels sont les appels Ajax que le code Javascript fait, c'est-à-dire charger le contenu, vous pourriez être en mesure d'utiliser l'URL de ces appels avec Jsoup. Pour ce faire, utilisez les Outils de Développeur de votre navigateur. Mais ce n'est pas garanti:

    • il se pourrait que l'url est dynamique et dépend de ce qui est sur la page
    • si le contenu n'est pas public, des cookies seront impliqués, et il ne suffit pas de consulter L'URL de la ressource
  2. dans ces cas, vous devrez "simuler" le travail d'un navigateur. Heureusement, de tels outils existent. Celui que je connais, et que je recommande, est PhantomJS . Il fonctionne avec Javascript, et vous aurez besoin de le lancer à partir de Java en démarrant un nouveau processus. Si vous voulez vous en tenir à Java, ce post liste quelques alternatives Java.

4
répondu Vic Seedoubleyew 2017-05-23 12:02:41

j'ai fait il y a un "chemin"! C'est peut-être plus une solution de contournement qu'une solution de rechange... Le code ci-dessous vérifie à la fois l'attribut meta "REFRESH" et les redirections javascript... Si l'un d'eux existe, la variable RedirectedUrl est définie. Si vous connaissez votre cible... Ensuite, vous pouvez récupérer la page cible et aller sur...

    String RedirectedUrl=null;
    Elements meta = page.select("html head meta");
    if (meta.attr("http-equiv").contains("REFRESH")) {
        RedirectedUrl = meta.attr("content").split("=")[1];
    } else {
        if (page.toString().contains("window.location.href")) {
            meta = page.select("script");
            for (Element script:meta) {
                String s = script.data();
                if (!s.isEmpty() && s.startsWith("window.location.href")) {
                    int start = s.indexOf("=");
                    int end = s.indexOf(";");
                    if (start>0 && end >start) {
                        s = s.substring(start+1,end);
                        s =s.replace("'", "").replace("\"", "");        
                        RedirectedUrl = s.trim();
                        break;
                    }
                }
            }
        }
    }

... now retrieve the redirected page again...
1
répondu salihcenap 2013-11-23 10:18:04

y a-t-il un moyen d'obtenir aussi du contenu généré par javascript lors de l'analyse de page avec Jsoup?

je vais deviner non, en pensant à combien cela serait difficile, sans construire un interpréteur javascript complet en Java.

0
répondu James 2015-09-06 17:24:13

, Essayez:

Document Doc = Jsoup.connect(url)
    .header("Accept-Encoding", "gzip, deflate")
    .userAgent("Mozilla/5.0 (Windows NT 6.1; WOW64; rv:23.0) Gecko/20100101 Firefox/23.0")
    .maxBodySize(0)
    .timeout(600000)
    .get();
-1
répondu Partha Pratim Dutta 2017-07-02 14:09:23