【问题标题】:Jsoup - hidden div class?Jsoup - 隐藏的 div 类?
【发布时间】:2019-02-03 17:43:45
【问题描述】:

我正在尝试抓取一个 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]");

返回了两个类名为“s_container”的 div,其中没有一个是我需要的:

然后我尝试访问那个父母

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

有人知道怎么回事吗?我感觉有点失落..

【问题讨论】:

    标签: html web-scraping jsoup


    【解决方案1】:

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

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

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

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

    我的方法是通过以下方式获取这些提要的 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 的局限性,另一种方法是停止使用 Jsoup,并使用 Selenium Webdriver,因为它支持通过 JavaScript 进行动态页面修改,因此您将获得最终结果的 HTML - 正是您在 Web 浏览器和 Inspector 中看到的内容。

    【讨论】:

    • 谢谢,非常有帮助! :) 我将尝试使用 Selenium
    【解决方案2】:

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

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

    输出:

    http://www.bellator.com/events/d306b5/bellator-newcastle-pitbull-vs-scope
    http://www.bellator.com/events/ylcu8d/bellator-215-mitrione-vs-kharitonov
    http://www.bellator.com/events/yk2djw/bellator-216-mvp-vs-daley
    http://www.bellator.com/events/e8rdqs/bellator-217-gallagher-vs-graham
    http://www.bellator.com/events/281wxq/bellator-218-sanchez-vs-grimshaw
    http://www.bellator.com/events/8lcbdi/bellator-219-koreshkov-vs-larkin
    http://www.bellator.com/events/9rqguc/bellator-macdonald-vs-fitch
    

    【讨论】:

      猜你喜欢
      • 2013-11-08
      • 1970-01-01
      • 2013-10-09
      • 2021-11-14
      • 1970-01-01
      • 2021-12-14
      • 2016-12-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多