java - Jsoup ArrayList 和 LinkedHashMap 组合

标签 java android arraylist linkedhashmap

我编写的代码使用 jsoup 访问网站,查看所有段落标题,然后将它们保存到名为 headingList 的 ArrayList 中。这是棘手的部分。我有一个以 Strings 作为键、以 ArrayLists 作为值的映射。该代码的设计方式要求它转到多个页面。因此,标题数量以及与标题相关的段落数量可能会有很大差异。所以,这里的想法是创建两个 int 值。在查看页面后会设置一个名为 headingAmt 的 int 值,并确定有多少个标题。第二个名为 headCount 的 int 值被初始化为值 1。然后我要做的是设置一个 while 循环,如下所示: while(headCount != headAmt + 1) 并在循环末尾递增它,以便当 headCount 遍历每个标题时终止。在 while 循环期间,我尝试遍历每个段落并将其添加到名为 items 的 ArrayList 中,然后获取 items arrayList 中的内容,然后将其设置为 map 中第一个项目的值。然后,清除 ArrayList,转到下一段,将其中的内容保存到 items,然后将该 ArrayList 设置为 map 中第二个项目的值,依此类推。我有可以发布的代码,但它很令人困惑,因为有问题的 while 循环已经被重新排列了很多次,因为我无法让它正常工作。

编辑以下代码,以防有人可以提供帮助:

public class Finder {

public Finder(String url) {
    String mainURL = "http://www.website.com";
    Map<String, List<String> > headMap  = new HashMap<>();
    ArrayList<String> headingList = new ArrayList<>();
    ArrayList<String> items = new ArrayList<>();
    int headCounter = 1;

    String itemList = "div > div:nth-child(1).category > ul:nth-child(2) > li.item > span";
    int headAmt;



    Document doc1 = null;


    ///// Connect to site to get menu /////
    try{
        doc1 = Jsoup.connect(url).userAgent("Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.135 Safari/537.36")
                .referrer("http://www.google.com")
                .get();
    }
    catch(IOException e){
        System.out.println("Can't connect to website");
    }

        /////// Get headings ////////
        Elements head = doc1.select("div > div > div > h3");

        ////// Loop through headings and add to ArrayList /////
        for(Element e: head){
            headingList.add(e.text());

        }
        headAmt = headingList.size();

        /*
        Here is the problem
         */

        while(headCounter != headAmt + 1){

            Elements elem = doc1.select("div > div:nth-child("+ headCounter +").category > ul:nth-child(2) > li.item > span");


            for (String key : headingList) {
                for(Element e : elem){
                items.add(e.text());
                }

                List<String> value = new ArrayList<>(items);
                headMap.put(key, value);
            }

            items.clear();
            headCounter++;
            }
            }
        }
    }
}

最佳答案

你可以尝试这样的事情:

public class Finder {
public static void main(String[] args) {
    new Finder(
            "http://www.allmenus.com/ny/new-york/250087-forlinis-restaurant/menu/");
}

public Finder(String url) {
    Document doc1 = null;
    try {
        doc1 = Jsoup
                .connect(url)
                .userAgent(
                        "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.135 Safari/537.36")
                .referrer("http://www.google.com").get();
    } catch (IOException e) {
        System.out.println("Can't connect to website");
    }
    Elements elements = doc1.select(".category");
    HashMap<String, ArrayList<List<String>>> menu = new HashMap<String, ArrayList<List<String>>>();
    for (Element e : elements) {
        String name = e.select(".category_head>h3").first().text();
        Elements itms = e.select("ul > li");
        ArrayList<List<String>> menuItems = new ArrayList<List<String>>();
        for (Element it : itms) {
            menuItems.add(Arrays.asList(new String[] {
                    it.select("span").first().text(),
                    it.select("span").eq(1).text() }));
        }
        menu.put(name, menuItems);

    }
    for (String key : menu.keySet()) {
        System.out.println(key);
        ArrayList<List<String>> lst = menu.get(key);
        for (List<String> item : lst) {
            System.out.println("       " + item.get(0) + " " + item.get(1));
        }
        System.out.println("\n");
    }
}
}

关于java - Jsoup ArrayList 和 LinkedHashMap 组合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30628743/

相关文章:

java - JVM 空间复杂度详细信息 : Singly Linked Lists vs Doubly Linked Lists

java-删除字符串列表中的子字符串

java - 需要删除字符串中多余的方括号

java - 是否可以覆盖Eclipse默认的代码格式

java - HtmlUnit - PKIX 路径构建失败 : unable to find valid certification path to requested target

android - 通过 USB 在 lg Nexus 4 上安装 apk

android - 展开/折叠动画 Android 半 View

android - 如何在 Android 按钮上创建阴影( Material 设计)

javax.ws.rs.core.Response 以集合作为实体

java - 通过选择 JComboBox 选项动态添加 JTextFields 和 JLabels