我正在尝试抓取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检查网站时,我看不到它有那个孩子。
有人知道发生了什么吗?我感到有点迷茫。
答案 0 :(得分:1)
您在Web浏览器中看到的不是Jsoup看到的。禁用JavaScript和刷新页面以获取Jsoup所获得的内容,或者在修改JavaScript之前在浏览器中按CTRL + U(“显示源代码”,而不是“检查”!)以查看原始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,而应使用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"));
}