我想用selenium和jsoup从这个动态网站中提取一些信息。要获取我想要提取的信息,我必须单击“Detailsöffnen”按钮。第一张图片显示了点击该按钮之前的网站,第二张图片显示了点击该按钮后的网站。红色标记的信息是我想要提取的信息。
我首先尝试仅使用Jsoup提取信息,但正如我被告知Jsoup无法处理动态内容,因此我现在尝试使用selenium和Jsoup提取信息,就像您在源代码中看到的那样。 Howerver我不确定selenium是否是正确的,所以也许还有其他方法来提取我需要的信息更简单,但重要的是可以用Java完成。
接下来的两张图片会在点击按钮之前和点击按钮之后显示html代码。
public static void main(String[] args) {
WebDriver driver = new FirefoxDriver(createFirefoxProfile());
driver.get("http://www.seminarbewertung.de/seminar-bewertungen?id=3448");
//driver.findElement(By.cssSelector("input[type='button'][value='Details öffnen']")).click();
WebElement webElement = driver.findElement(By.cssSelector("input[type='submit'][value='Details öffnen'][rating_id='2318']"));
JavascriptExecutor executor = (JavascriptExecutor)driver;
executor.executeScript("arguments[0].click();", webElement);
String html_content = driver.getPageSource();
//driver.close();
Document doc1 = Jsoup.parse(html_content);
System.out.println("Hallo");
Elements elements = doc1.getAllElements();
for (Element element : elements) {
System.out.println(element);
}
}
private static FirefoxProfile createFirefoxProfile() {
File profileDir = new File("/tmp/firefox-profile-dir");
if (profileDir.exists())
return new FirefoxProfile(profileDir);
FirefoxProfile firefoxProfile = new FirefoxProfile();
File dir = firefoxProfile.layoutOnDisk();
try {
profileDir.mkdirs();
FileUtils.copyDirectory(dir, profileDir);
} catch (IOException e) {
e.printStackTrace();
}
return firefoxProfile;
}
使用这个源代码,我找不到包含我想要提取的信息的div元素。
如果有人可以帮助我,那真的很棒。
答案 0 :(得分:3)
如果生成javascript,Jsoup无法处理动态内容,但在您的情况下,按钮正在发出Ajax请求,这可以通过Jsoup完成。
我建议打电话来解除按钮及其ID,然后进行成功调用(Ajax帖子)以检索详细信息(评论或其他)。
代码可以是:
Document document = Jsoup.connect("http://www.seminarbewertung.de/seminar-bewertungen?id=3448").get();
//we retrieve the buttons
Elements select = document.select("input.rating_expand");
//we go for the first
Element element = select.get(0);
//we pick the id
String ratingId = element.attr("rating_id");
//the Ajax call
Document document2 = Jsoup.connect("http://www.seminarbewertung.de/bewertungs-details-abfragen")
.header("Accept", "*/*")
.header("X-Requested-With", "XMLHttpRequest")
.data("rating_id", ratingId)
.post();
//we find the comment, and we are done
//note that this selector is only as a demo, feel free to adjust to your needs
Elements select2 = document2.select("div.ratingbox div.panel-body.text-center");
//We are done!
System.out.println(select2.text());
此代码将打印所需的:
Das Eingehen aufindividuelleBedürfnisseinesjeden einzelnen Teilnehmer scheint mir ein Markenzeichen von Fromm zu sein。 Beieinemfrüheren研讨会habe ich死了auch schon所以erlebt!
我希望它会有所帮助。
祝新年快乐!