Hướng dẫn does jsoup run javascript? - jsoup có chạy javascript không?

Một khối trên trang chứa đầy nội dung của JavaScript và sau khi tải trang với JSoup, không có gì trong số đó. Có cách nào để có được nội dung được tạo JavaScript khi phân tích cú pháp trang với

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();
        }
    }
}
1 không?

Không thể dán mã trang ở đây, vì nó quá dài: http://pastebin.com/qw4rfqgw

Đây là yếu tố mà nội dung tôi cần:

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();
        }
    }
}
2

Tôi cần có được thông tin này trong Java. Tốt hơn là sử dụng jsoup. Phần tử là trường với sự trợ giúp của JavaScript:


Mã 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();
        }
    }
}

Hướng dẫn does jsoup run javascript? - jsoup có chạy javascript không?

Hỏi ngày 20 tháng 9 năm 2011 lúc 17:01Sep 20, 2011 at 17:01

Hướng dẫn does jsoup run javascript? - jsoup có chạy javascript không?

0

JSOUP là một trình phân tích cú pháp HTML, không phải là một loại động cơ trình duyệt nhúng. Điều này có nghĩa là nó hoàn toàn không biết về bất kỳ nội dung nào được JavaScript thêm vào DOM sau khi tải trang ban đầu.HTML parser, not some kind of embedded browser engine. This means that it's completely unaware of any content that is added to the DOM by Javascript after the initial page load.

Để có quyền truy cập vào loại nội dung đó, bạn sẽ cần một thành phần trình duyệt nhúng, có một số cuộc thảo luận về loại thành phần đó, ví dụ: có cách nào để nhúng trình duyệt vào Java không?

Đã trả lời ngày 20 tháng 9 năm 2011 lúc 17:42Sep 20, 2011 at 17:42

fvufvufvu

32.1k6 Huy hiệu vàng60 Huy hiệu bạc79 Huy hiệu đồng6 gold badges60 silver badges79 bronze badges

1

Đã giải quyết trong trường hợp của tôi với com.codeborne.phantomjsdriver Lưu ý: Đó là mã Groovy.

pom.xml

        
          com.codeborne
          phantomjsdriver
            
        

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);
    }
}

ClassInProject.groovy

Document doc = PhantomJsUtils.renderPage(Jsoup.parse(yourSource))

Đã trả lời ngày 7 tháng 9 năm 2016 lúc 12:12Sep 7, 2016 at 12:12

Iluiluilu

1961 Huy hiệu bạc6 Huy hiệu đồng1 silver badge6 bronze badges

3

Bạn cần hiểu những gì đang xảy ra:

  • Khi bạn truy vấn một trang từ một trang web, cho dù sử dụng JSOUP hoặc trình duyệt của bạn, những gì được gửi lại cho bạn là một số HTML. JSOUP có thể phân tích cú pháp đó.
  • Tuy nhiên, hầu hết các trang web bao gồm JavaScript trong HTML đó hoặc được liên kết từ HTML đó, sẽ điền vào trang với nội dung. Trình duyệt của bạn có thể thực thi JavaScript và do đó điền vào trang. JSOUP không.

Cách để hiểu điều này là như sau: Mã phân tích cú pháp HTML rất dễ dàng. Việc thực hiện mã JavaScript và cập nhật mã HTML tương ứng phức tạp hơn rất nhiều và là công việc của trình duyệt.

Dưới đây là một số giải pháp cho loại vấn đề này:

  1. Nếu bạn có thể tìm thấy những cuộc gọi AJAX mà mã JavaScript đang thực hiện là gì, đó là tải nội dung, bạn có thể sử dụng URL của các cuộc gọi này với JSOUP. Để làm điều đó, hãy sử dụng các công cụ phát triển từ trình duyệt của bạn. Nhưng điều này không được đảm bảo để làm việc:

    • Nó có thể là URL năng động và phụ thuộc vào những gì trên trang tại thời điểm đó
    • Nếu nội dung không công khai, cookie sẽ được tham gia và chỉ cần truy vấn URL tài nguyên sẽ không đủ
  2. Trong những trường hợp này, bạn sẽ cần "mô phỏng" công việc của trình duyệt. May mắn thay, các công cụ như vậy tồn tại. Người tôi biết, và đề nghị, là Phantomjs. Nó hoạt động với JavaScript và bạn sẽ cần khởi chạy nó từ Java bằng cách bắt đầu một quy trình mới. Nếu bạn muốn gắn bó với Java, bài đăng này liệt kê một số lựa chọn thay thế Java.

Đã trả lời ngày 19 tháng 8 năm 2016 lúc 21:50Aug 19, 2016 at 21:50

Hướng dẫn does jsoup run javascript? - jsoup có chạy javascript không?

Vic Seedoungleyewvic SeedoubleyewVic Seedoubleyew

10,2K6 Huy hiệu vàng 50 Huy hiệu bạc71 Huy hiệu Đồng6 gold badges50 silver badges71 bronze badges

Bạn có thể sử dụng kết hợp JSOUP và HTMLUNIT để có được nội dung trang sau khi các tập lệnh JavaScript được tải hoàn thành.

pom.xml


    net.sourceforge.htmlunit
    htmlunit
    3.35

Ví dụ đơn giản từ tệp https://riptutorial.com/jsoup/example/16274/parsing-javascript-generated-page-with-jsoup-and-htmunit From file https://riptutorial.com/jsoup/example/16274/parsing-javascript-generated-page-with-jsoup-and-htmunit

// load page using HTML Unit and fire scripts
WebClient webClient2 = new WebClient();
HtmlPage myPage = webClient2.getPage(new File("page.html").toURI().toURL());

// convert page to generated HTML and convert to document
Document doc = Jsoup.parse(myPage.asXml());

// iterate row and col
for (Element row : doc.select("table#data > tbody > tr"))
    for (Element col : row.select("td"))
        // print results
        System.out.println(col.ownText());

// clean up resources        
webClient2.close();

Một ví dụ phức tạp: Tải đăng nhập, nhận phiên và CSRF, sau đó đăng và đợi trang chủ để hoàn thành tải (15 giây) Load login, get Session and CSRF, then post and wait for home page to finish loading (15 seconds)

import java.io.IOException;
import java.net.HttpCookie;
import java.net.MalformedURLException;
import java.net.URL;

import org.jsoup.Connection;
import org.jsoup.Connection.Method;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;

import com.gargoylesoftware.htmlunit.FailingHttpStatusCodeException;
import com.gargoylesoftware.htmlunit.HttpMethod;
import com.gargoylesoftware.htmlunit.NicelyResynchronizingAjaxController;
import com.gargoylesoftware.htmlunit.WebClient;
import com.gargoylesoftware.htmlunit.WebRequest;
import com.gargoylesoftware.htmlunit.html.HtmlPage;

//JSoup load Login Page and get Session Details
Connection.Response res = Jsoup.connect("https://loginpage").method(Method.GET).execute();

String sessionId = res.cookie("findSESSION");
String csrf = res.cookie("findCSRF");

HttpCookie cookie = new HttpCookie("findCSRF", csrf);
cookie.setDomain("domain.url");
cookie.setPath("/path");

WebClient webClient = new WebClient();
webClient.addCookie(cookie.toString(),
            new URL("https://url"),
            "https://referrer");

// Add other cookies/ Session ...

webClient.getOptions().setJavaScriptEnabled(true);
webClient.getOptions().setCssEnabled(false);
webClient.getOptions().setUseInsecureSSL(true);
webClient.getOptions().setThrowExceptionOnFailingStatusCode(false);
webClient.getCookieManager().setCookiesEnabled(true);
webClient.setAjaxController(new NicelyResynchronizingAjaxController());
// Wait time
webClient.waitForBackgroundJavaScript(15000);
webClient.getOptions().setThrowExceptionOnScriptError(false);

URL url = new URL("https://login.path");
WebRequest requestSettings = new WebRequest(url, HttpMethod.POST);

requestSettings.setRequestBody("user=234&pass=sdsdc&CSRFToken="+csrf);
HtmlPage page = webClient.getPage(requestSettings);

// Wait
synchronized (page) {
    try {
        page.wait(15000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}

// Parse logged in page as needed
Document doc = Jsoup.parse(page.asXml());

Đã trả lời ngày 30 tháng 4 năm 2020 lúc 19:53Apr 30, 2020 at 19:53

SullysullySully

14.4K5 Huy hiệu vàng52 Huy hiệu bạc77 Huy hiệu đồng5 gold badges52 silver badges77 bronze badges

0

Tôi thực tế có một "cách"! Có thể đó là "một cách giải quyết" hơn là "cách ... mã bên dưới kiểm tra cả hai cho thuộc tính meta" Làm mới "và JavaScript chuyển hướng ... nếu một trong số đó tồn tại

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();
        }
    }
}
3 biến được đặt. Vì vậy, bạn biết mục tiêu của bạn ... Sau đó, bạn có thể truy xuất trang đích và tiếp tục ...

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

Đã trả lời ngày 23 tháng 11 năm 2013 lúc 10:18Nov 23, 2013 at 10:18

Hướng dẫn does jsoup run javascript? - jsoup có chạy javascript không?

Salihcenapsalihcenapsalihcenap

1.90222 Huy hiệu bạc25 Huy hiệu đồng22 silver badges25 bronze badges

Đã trả lời ngày 6 tháng 12 năm 2018 lúc 14:27Dec 6, 2018 at 14:27

Hướng dẫn does jsoup run javascript? - jsoup có chạy javascript không?

emonemonemon

1.4291 Huy hiệu vàng16 Huy hiệu bạc17 Huy hiệu đồng1 gold badge16 silver badges17 bronze badges

Có cách nào để có được nội dung được tạo JavaScript khi phân tích cú pháp với JSOUP không?

Tôi sẽ đoán không, nghĩ về việc điều này sẽ khó khăn như thế nào, nếu không xây dựng toàn bộ thông dịch viên JavaScript trong Java.

Hướng dẫn does jsoup run javascript? - jsoup có chạy javascript không?

Đã trả lời ngày 20 tháng 9 năm 2011 lúc 17:43Sep 20, 2011 at 17:43

Hướng dẫn does jsoup run javascript? - jsoup có chạy javascript không?

JamesjamesJames

Huy hiệu vàng 20k2 Huy hiệu bạc40 Huy hiệu đồng2 gold badges24 silver badges40 bronze badges

2

Có thể bằng cách kết hợp

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();
        }
    }
}
4 với một khung khác để giải thích trang web, trong ví dụ của tôi ở đây tôi đang sử dụng
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();
        }
    }
}
5.

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

import com.gargoylesoftware.htmlunit.WebClient;
import com.gargoylesoftware.htmlunit.html.HtmlPage;

...

WebClient webClient = new WebClient();
HtmlPage myPage = webClient.getPage(URL);

Document document = Jsoup.parse(myPage.asXml());
Elements otherLinks = document.select("a[href]");

Đã trả lời ngày 16 tháng 1 năm 2020 lúc 9:23Jan 16, 2020 at 9:23

resresres

7658 Huy hiệu bạc16 Huy hiệu Đồng8 silver badges16 bronze badges

Try:

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();
        }
    }
}
0

Hướng dẫn does jsoup run javascript? - jsoup có chạy javascript không?

Tiger-222

6.3463 huy hiệu vàng46 Huy hiệu bạc59 Huy hiệu đồng3 gold badges46 silver badges59 bronze badges

Đã trả lời ngày 2 tháng 7 năm 2017 lúc 13:27Jul 2, 2017 at 13:27

Hướng dẫn does jsoup run javascript? - jsoup có chạy javascript không?

0