我正在用 Java 创建简单的抓取器供我使用。总的来说,我想做的事情是:
- 从主页获取所有链接并检查它们是否是内部链接
- 将内部链接存储在列表中(暂时将它们存储在集合中) 避免重复链接然后保存到列表)
- 访问旧列表中的链接
- 从页面获取所有链接,再次将它们存储在 set 中,然后存储在 listNew 中
- 返回到第 3 步,但访问列表中的下一个链接(这只是一个 List 上的“for”循环,迭代 listOld 上的每个元素)
- 当列表中的所有链接都被访问时,比较 listOld 和 listNew,每个 不在 List 上的链接 listNew 将添加到 listTemp。
- 来自 listTemp 和 List 的链接将添加到内部链接
- listOld 和 listNew 被清除,listTemp 内容被添加到 List
- 返回第三步
- 程序在第 6 步结束时结束 listTemp = null (如此简单 do...while with check,检查在 6 号结束时更改为 true 步骤listTemp = null)
这是我的代码
package com.amazon.tests;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;
public class Grabber {
private WebDriver driver;
private List<String> internalLinks = new ArrayList<String>();
private Set<String> noDuplicates = new HashSet<>();
private List<WebElement> linksOnPage = new ArrayList<>();
private List<String> listOld = new ArrayList<>();
private List<String> listNew = new ArrayList<>();
private List<String> listTemp = new ArrayList<>();
@BeforeClass
public void setup() {
System.setProperty("webdriver.chrome.driver","C:/TEST/LIB/chromedriver.exe");
driver = new ChromeDriver();
}
@AfterClass
public void teardown() {
driver.close();
}
@Test
public void grabber()
{
String hrefvalue = null;
boolean check = false;
driver.get("https://www.redbullmobile.pl/");
linksOnPage = driver.findElements(By.tagName("a"));
for (int i = 0; i<linksOnPage.size(); i++)
{
hrefvalue = linksOnPage.get(i).getAttribute("href");
if(hrefvalue != null)
{
if(hrefvalue.contains("redbullmobile") && !hrefvalue.contains("facebook") && !hrefvalue.contains("redbullmobile.play.pl") && !hrefvalue.contains("redbullmobilecollect") && !hrefvalue.contains("fb.com") && !hrefvalue.contains(".pdf"))
{
noDuplicates.add(linksOnPage.get(i).getAttribute("href"));
}
}
}
listOld.addAll(noDuplicates);
hrefvalue = null;
linksOnPage.clear();
noDuplicates.clear();
do
{
listTemp.clear();
for (int i = 0; i<listOld.size(); i++)
{
driver.get(listOld.get(i));
linksOnPage = driver.findElements(By.tagName("a"));
for (int i1 = 0; i1<linksOnPage.size(); i1++)
{
hrefvalue = linksOnPage.get(i1).getAttribute("href");
if(hrefvalue != null)
{
if(hrefvalue.contains("redbullmobile") && !hrefvalue.contains("facebook") && !hrefvalue.contains("redbullmobile.play.pl") && !hrefvalue.contains("redbullmobilecollect") && !hrefvalue.contains("fb.com") && !hrefvalue.contains(".pdf"))
{
noDuplicates.add(linksOnPage.get(i1).getAttribute("href"));
}
}
}
}
//When all links from listOld are visited compare listOld and listNew, every link listNew that's not on List is added to listTemp.
//Links from ListTemp and ListOld are added to ListFinal
internalLinks.addAll(listOld);
internalLinks.addAll(listTemp);
//listOld and listNew are cleared, listTemp content is added to listOld
listOld.clear();
listNew.clear();
listOld.addAll(listTemp);
//Go back to 3rd step
//Program end when at then end of 6th step listTemp = null (so simple do...while with check, check changes to true when at the end of 6th step listTemp = null)
if (listTemp.isEmpty())
{
check = true;
}
}while(check);
}
}
但是我在第 6 步中遇到了问题。我真的不知道如何将 listOld
上的每个元素与 listNew
上的每个元素进行比较,然后将不匹配的元素添加到 listTemp
中。有人可以帮助我吗?
此外,我认为我可以缩短此代码(基本上通过在 do...while
开始之前将 https://www.redbullmobile.pl/
添加到 listOld
来删除 (do...while
开始之前的代码)。我是对的还是错过了什么?
最佳答案
如您所知,List 包含一个 addAll
方法,用于将列表中的所有元素添加到第一个元素。
它还包含 removeAll
method做相反的事情。
boolean removeAll(Collection c)
Removes from this list all of its elements that are contained in the specified collection
关于java - 比较两个列表的内容,Java,Selenium,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50944995/