Jsoup извлечения частичной страницы - PullRequest
8 голосов
/ 16 июня 2011

Я пытаюсь очистить содержимое сайтов-участников торгов, но не могу получить полную страницу сайта.Я использую лом на xulrunner, чтобы сначала извлечь страницу (поскольку ajax загружает определенные элементы ленивым способом), а затем вычистить из файла.Но на главной странице сайта bidrivals это не удается, даже если локальный файл сформирован правильно.Просто кажется, что jSoup оканчивается символами «...» в середине HTML-кода.Если кто-то сталкивался с этим раньше, пожалуйста, помогите.Следующий код вызывается для [ этой ссылки ].

File f = new File(projectLocation+logFile+"bidrivalsHome");
    try {
        f.createNewFile();
        log.warn("Trying to fetch mainpage through a console.");
        WinRedirect.redirect(projectLocation+"Curl.exe -s --data \"url="+website+"&delay="+timeDelay+"\" http://127.0.0.1:10000", projectLocation, logFile+"bidrivalsHome");
    } catch (Exception e) {
        e.printStackTrace();
        log.warn("Error in fetching the nameList", e);
    }
    Document doc = new Document("");
    try {
        doc = Jsoup.parse(f, "UTF-8", website);
    } catch (IOException e1) {
        System.out.println("Error while parsing the document.");
        e1.printStackTrace();
        log.warn("Error in parsing homepage", e1);
    }

1 Ответ

1 голос
/ 03 августа 2016

Попробуйте использовать HtmlUnit для рендеринга страницы (включая манипуляции с JavaScript и CSS), а затем передайте обработанный HTML-код в jsoup.

// load page using HTML Unit and fire scripts
WebClient webClient = new WebClient();
HtmlPage myPage = webClient.getPage(myURL);

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

// clean up resources        
webClient.close();


page.html - исходный код

<html>
<head>
    <script src="loadData.js"></script>
</head>
<body onLoad="loadData()">
    <div class="container">
        <table id="data" border="1">
            <tr>
                <th>col1</th>
                <th>col2</th>
            </tr>
        </table>
    </div>
</body>
</html>

loadData.js

    // append rows and cols to table.data in page.html
    function loadData() {
        data = document.getElementById("data");
        for (var row = 0; row < 2; row++) {
            var tr = document.createElement("tr");
            for (var col = 0; col < 2; col++) {
                td = document.createElement("td");
                td.appendChild(document.createTextNode(row + "." + col));
                tr.appendChild(td);
            }
            data.appendChild(tr);
        }
    }

page.html при загрузке в браузер

| Col1 | Col2 | | ------ | ------ | | 0.0 | 0,1 | | 1.0 | 1.1 |

Использование jsoup для анализа page.html для данных col *

    // load source from file
    Document doc = Jsoup.parse(new File("page.html"), "UTF-8");

    // iterate over 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());

выход

(пусто)

Что случилось?

Jsoup анализирует исходный код как доставленный с сервера (или в данном случае загруженный из файла). Он не вызывает действия на стороне клиента, такие как манипуляции с JavaScript или CSS DOM. В этом примере строки и столбцы никогда не добавляются в таблицу данных.

Как проанализировать мою страницу как отображенную в браузере?

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

    // convert page to generated HTML and convert to 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        
    webClient.close();

выход

0.0
0.1
1.0
1.1
...