【问题标题】:Get actual page and the last page from an URL with JSOUP使用 JSOUP 从 URL 获取实际页面和最后一页
【发布时间】:2020-12-15 03:34:08
【问题描述】:

我正在尝试获取实际页面和最后一页,有人可以帮助我吗?

我的代码:

public void conectarSite(String url) throws IOException, InterruptedException {
        page = Jsoup.connect(url).data("query", "Java").userAgent("Agent").cookie("auth", "token").timeout(3000).post();
        
        
        //get actual Page
        Elements ActualPa=page.getElementsByClass("page active");
    
                        
        //get last Page
        Elements nextPage=page.getElementsByClass("page");
        int numPaginas =Integer.parseInt(nextPage.attr("#"));
                
    
    }

对于最后一页,使用此代码,我得到 "0" 。 在附件中,我发送了 HTML 代码的打印屏幕。如您所见,实际页面在“页面活动”类中,当前值为“1”,最后一页的值为“16”。

谢谢你们!

【问题讨论】:

    标签: java html pagination jsoup screen-scraping


    【解决方案1】:

    有用:https://jsoup.org/cookbook/extracting-data/selector-syntax(页面下方)

    我冒昧地为 HTML 输入了一个更基本的字符串,但是... 你可以这样做:

    
    import org.jsoup.Jsoup;
    import org.jsoup.nodes.Document;
    
    public class PageExtraction {
    
        public static void main(String... args) {
            String url = "<ul>"
                    + "<li class=\"prev\">"
                    +   "<a href=\"#\"><</a>"
                    + "</li>"
                    + "<li class=\"page active\">"
                    +   "<a href=\"#\">1</a>"
                    + "</li>"
                    + "<li class=\"page\">2</li>"
                    + "<li class=\"page\">3</li>"
                    + "<li class=\"page\">4</li>"
                    + "<li class=\"page\">5</li>"
                    + "<li class=\"page\">6</li>"
                    + "<li class=\"page\">...</li>"
                    + "<li class=\"page\">"
                    +   "<a href=\"#\">16</a>"
                    + "</li>"
                    + "</ul>";
    
            Document doc = Jsoup.parse(url);
            String activePage = doc.select("[class=page active] a").text(); // elements with class "page active"
            String allPages = doc.select("li.page a").last().text(); // list elements with class page
    
            // TODO what if last page > some max threshold?
        }
    }
    

    【讨论】:

    • 你的代码很完美!但是我无法将活动页面的元素获取到 String,我正在使用此选择器获取元素 code String url = "auchan.pt/Frontoffice/search/frango";文档页面 = Jsoup.connect(url).userAgent("Agent").get();元素 test=page.select("#DivWrapperProductItem > div:nth-child(6) > ul > li.page.active"); code 然而回报什么都没有。我正在这个网址中搜索“auchan.pt/Frontoffice/search/frango”。这个想法是获取元素并保存到字符串并使用您的代码从字符串中提取活动页面!
    • 我试过你的代码。如果您尝试访问未设置 cookie 的 url,您会收到一个 HTTP 重定向 (302) 响应到登录页面,该页面设置了一些您的浏览器会记住的 cookie。这些跟踪用户会话。因此,您需要执行一些初始 HTTP 请求来记录这些 cookie,就像您的浏览器通常会做的那样。由于我做了一些屏幕抓取,我已经有一些代码可以帮助解决这个问题。我将在下一条评论中提出解决方案。如果您不坚持使用 JSoup,我建议您使用 HtmlUnit,因为它使用 XPath 来获取数据,这是学习和使用的更好标准
    • 令人讨厌的是,我试图让它与 JSoup 一起工作,但这似乎是不可能的。我可以执行完全相同的 curl 请求并且很好。但是对于 JSoup,它每次都会失败。我现在只能建议使用 HtmlUnit,或者您可以尝试重建此处发出的 HTTP GET 请求:auchan.pt/Frontoffice/Scripts/bundle.min.js,您可以通过在脚本内容中搜索 url: rootUrl + 找到它并向后工作。使用 RestTemplate 发出请求(提示:使用方法 restTemplate.exchange(url, headers, null, String.class) 将 headers/url 中的相关内容替换
    • 如果您尝试重建 http GET 请求,我想您还需要一些 HTTP 知识来使用一些隐藏的表单字段来重建请求,以防止跨站点伪造请求( CSRF 令牌)。
    • 非常感谢@Rob Evans!我用另一种方法解决了。
    猜你喜欢
    • 2020-03-07
    • 2015-01-04
    • 2013-05-27
    • 2014-05-26
    • 2018-02-07
    • 2015-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多