Jsoup-隐藏的div类?

时间:2019-02-03 17:43:46

标签: html web-scraping jsoup

我正在尝试抓取div类,但到目前为止,我尝试过的所有操作都失败了:(

我正在尝试刮擦元素:

<a href="http://www.bellator.com/events/d306b5/bellator-newcastle-pitbull-vs- 
scope"><div class="s_buttons_button s_buttons_buttonAlt 
s_buttons_buttonSlashBack">More info</div></a>

从网站上:http://www.bellator.com/events

我尝试通过这样做来访问元素列表

Elements elements = document.select("div[class=s_container] > li");

但是那什么也没返回。

然后我尝试使用

仅访问父级
Elements elements = document.select("div[class=s_container]");

并且返回了两个div,其类名为“ s_container”,我需要的不是一个:<< / p>

然后我尝试使用

Elements elements = document.select("div[class=ent_m152_bellator module 
ent_m152_bellator_V1_1_0 ent_m152]");

那没有返回任何东西

我也尝试过

Elements elements = document.select("div[class=ent_m152_bellator]");

因为我不确定空白,但是它也不返回任何内容

然后我尝试通过

访问其父项
Elements elements = document.select("div#t3_lc");

可以,但是返回了一个包含

的元素
<div id="t3_lc"> 
<div class="triforce-module" id="t3_lc_promo1"></div> 
</div>

这有点奇怪,因为当我用chrome:S检查网站时,我看不到它有那个孩子。

有人知道发生了什么吗?我感到有点迷茫。

2 个答案:

答案 0 :(得分:1)

您在Web浏览器中看到的不是Jsoup看到的。禁用JavaScript和刷新页面以获取Jsoup所获得的内容,或者在修改JavaScript之前在浏览器中按CTRL + U(“显示源代码”,而不是“检查”!)以查看原始HTML文档。当您使用浏览器的调试器时,它会显示修改后的最终文档,因此不符合您的需求。

似乎整个“即将发生的事件”部分都是由JavaScript动态加载的。 更重要的是,此部分使用AJAX异步加载。您可以使用浏览器调试器(“网络”标签)查看所有可能的请求和响应。

enter image description here

我找到了它,但是不幸的是,您需要的所有数据都以JSON的形式返回,因此您将需要另一个库来解析JSON。

这不是坏消息的结局,这种情况更加复杂。您可以直接请求数据: http://www.bellator.com/feeds/ent_m152_bellator/V1_1_0/d10a728c-547e-4a6f-b140-7eecb67cff6b 但该URL似乎是随机的,并且这些URL中的很少(每个即将发生的事件之一)都包含在HTML的JavaScript代码中。

enter image description here

我的方法是通过以下方式获取这些供稿的URL:


        List<String> feedUrls = new ArrayList<>();

        //select all the scripts
        Elements scripts = document.select("script");
        for(Element script: scripts){
            if(script.text().contains("http://www.bellator.com/feeds/")){
                // here use regexp to get all URLs from script.text() and add them to feedUrls

            }
        }

        for(String feedUrl : feedUrls){
            // iterate over feed URLs, download each of them
            String json = Jsoup.connect(feedUrl).ignoreContentType(true).get().body().toString();
            // here use JSON parsing library to get the data you need

        }

另一种替代方法是,由于其局限性而停止使用Jsoup,而应使用Selenium Webdriver,因为它支持通过JavaScript进行动态页面修改,因此您将获得最终结果的HTML,与您在Web浏览器和Inspector中看到的完全一样。 / p>

答案 1 :(得分:0)

如果将来有人发现它;我设法用Selenium解决了它,不知道它是否是一个好的/正确的解决方案,但它似乎正在工作。

@Override public void onStop() { if (dialog != null) { dialog.dismiss(); dialog = null; }}

输出:

    System.setProperty("webdriver.chrome.driver", "C:\\Users\\PC\\Desktop\\Chromedriver\\chromedriver.exe");
    WebDriver driver = new ChromeDriver();
    driver.get("http://www.bellator.com/events");

    String html = driver.getPageSource();
    Document doc = Jsoup.parse(html);

    Elements elements = doc.select("ul.s_layouts_lineListAlt > li > a");
    for(Element element : elements) {
        System.out.println(element.attr("href"));
    }