如何通过特定属性过滤WebImages?

时间:2019-07-12 11:14:02

标签: java selenium webdriver

我正在尝试编写一个程序,该程序将自动进行google-pictures-search并下载给定String的第一张图片。

我正在使用Google的Selenium Webdriver来完成所有操作,但是我可以更改它。我试图过滤结果,但唯一与我不同的是“ data-atf”属性。我想下载第一个,所以应该下载为零,但是之后如何搜索?此外,由于给定的字符串不同,其他属性也会始终更改。

String = "German Shepherd"
ChromeDriver driver = new ChromeDriver();
driver.get("https:/google.com/search?q=" + String + 
"&source=lnms&tbm=isch&sa=X&ved=0ahUKEw
 iXlMO0nq_jAhUEzaQKHVVXC50Q_AUIEygE&biw 
 =834&bih=770");



//and then I've got something like this
//wont work because cssSelector is always different
WebElement img = driver.findElement(By.cssSelector("#selector"));
BufferedImage buffer = ImageIO.read(new URL(img.getAttribute("src")));
ImageIO.write(buffer, "png", new File("image.png"));
} catch (Exception e) {
    e.printStackTrace();
} finally {
    driver.close();
}

第二部分的信用:Save/copy to clipboard image from page by chrome console

最重要的是,我需要帮助来过滤结果,此后,非常感谢您帮助下载。

1 个答案:

答案 0 :(得分:1)

如果要将图像过滤为仅具有data-atf属性的图像,最简单的方法是通过XPath selector

//img[@data-atf]

或者,如果您只希望“搜索结果”的子级:

//h2[text()='Search Results']/parent::*/descendant::img[@data-atf]

当然,您也可以使用Stream.filter()函数

过滤Java代码中的图像
List<WebElement> allImages = driver.findElements(By.tagName("img"));
System.out.println("All images #: " + allImages.size());

List<WebElement> imagesWithDataAtf = allImages
        .stream()
        .filter(image -> image.getAttribute("data-atf") != null)
        .collect(Collectors.toList());

System.out.println("Images with data-atf attribute #: " + imagesWithDataAtf.size());