。contains()问题/看起来不起作用

问题描述 投票:0回答:2

我正在使用网络抓取工具,但是连续第二天都无法解决问题。

此方法的问题是,当机器人应访问网站,收获所有URL,并将尚未访问的URL添加到List “ toVisit”]

问题代码:

Elements temp = userAgent.visit(currentUrl).findEvery("<a href>");
for (Element e : temp) {
    String x = e.getAt("href");
    if(!visited.contains(x)) { 
            toVisit.add(x);
    }
}

但是,if语句不过滤(或以我未发现的方式对其进行过滤)URL,并且我不知道为什么。

我尝试删除“!”在该语句中创建一个else部分,并将其粘贴到此处的Visit.add(x),但这没有帮助。

当我打印每个URL时,机器人会访问相同的URL两次甚至五次。

编辑(已定义访问)

static List<String> visited = new ArrayList<String>();

EDIT2(完整代码)

import java.util.ArrayList;
import java.util.List;
import com.jaunt.*;

public class b03 {

    static String currentUrl = "https://stackoverflow.com";
    static String stayAt = currentUrl;
    static String searchingTerm = "";
    static int toSearch = 50;

    static List<String> toVisit = new ArrayList<String>();
    static List<String> visited = new ArrayList<String>();

    static UserAgent userAgent = new UserAgent();   

    public static void main(String[] args) {
        System.out.println("*started searching...*");

        while(visited.size() < toSearch)
            visitUrl(currentUrl);

        System.out.println("\n\n*done*\n\n");
    }

    public static void visitUrl(String url) {
            visited.add(url);
            evaluateUrls();
            searchTerm();
            toVisit.remove(0);
            currentUrl = toVisit.get(0);
    }

    public static void searchTerm() {
        //if(userAgent.doc.getTextContent().contains(searchingTerm)) 
            System.out.println(visited.size() +") "+ currentUrl);
    }

    public static void evaluateUrls() {
        try {
            Elements temp = userAgent.visit(currentUrl).findEvery("<a href>");
            for (Element e : temp) {
                String x = e.getAt("href");
                if(!visited.contains(x) && x.contains(stayAt)) { 
                        toVisit.add(x);
                }
            }
        }catch (Exception e) {
            System.out.println(e);
        }
    }
}
java string contains jaunt-api
2个回答
0
投票

您的机器人多次访问了一些URL,因为您多次将它们添加到toVisit列表中。

<< )和作业(stackoverflow.jobs),您的机器人会将其中三个添加到toVisit列表中。

接下来,它会访问标签页面(stackoverflow.com/tags)。此页面再次包含指向与以前相同的四个URL的链接。由于您尚未访问用户和作业子页面,因此它将第二次添加到toVisit列表中。

要解决此问题,您只应将不在toVisit列表中的URL添加到visited列表中

and不在toVisit列表中:

if (!visited.contains(x) && !toVisit.contains(x) && x.contains(stayAt)) { toVisit.add(x); }

-1
投票
由于存在Jaunt lib,我无法尝试此代码

分割您的代码,使其可读。尽量不要使用“静态”。

希望有帮助

import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; import com.jaunt.*; public class B03 { static String currentUrl = "https://stackoverflow.com"; static String stayAt = currentUrl; static String searchingTerm = ""; static int toSearch = 50; static List<String> toVisit = new ArrayList<String>(); static List<String> visited = new ArrayList<String>(); static UserAgent userAgent = new UserAgent(); public static void main(String[] args) { System.out.println("*started searching...*"); toVisit.add(currentUrl); while(toVisit.size() > 0 && visited.size() < toSearch){ visitUrl(toVisit.get(0)); } System.out.println("\n\n*done*\n\n"); } public static void visitUrl(String url) { List<String> ee = evaluateUrls(url); searchTerm(url); visited.add(url); toVisit.remove(url); toVisit.addAll(ee.stream().filter( e -> !visited.contains(e)).collect(Collectors.toList())); toVisit.remove(0); } public static void searchTerm(String currentUrl) { //if(userAgent.doc.getTextContent().contains(searchingTerm)) System.out.println(visited.size() +") "+ currentUrl); } public List<String> evaluateUrls(String currentUrl) { List<String> subUrls = new ArrayList<>(); try { Elements temp = userAgent.visit(currentUrl).findEvery("<a href>"); for (Element e : temp) { String x = e.getAt("href"); subUrls.add(x); } }catch (Exception e) { System.out.println(e); } return subUrls; } }

© www.soinside.com 2019 - 2024. All rights reserved.