2015-06-03 35 views
0

我寫的代碼使用jsoup去一個站點,查看所有段落標題,然後將它們保存到名爲headingList的ArrayList。這是棘手的部分。我有一個將Strings作爲鍵和ArrayLists作爲值的映射。該代碼的設計方式要求它轉到多個頁面。正因爲如此,標題金額可能與標題相關的段落金額大不相同。所以,這裏的想法是創建兩個int值。一個名爲headingAmt的int值在查看頁面並確定有多少個標題後設置。第二個int值叫做headCount被初始化爲1,然後我要做的就是設置一個while循環,如下所示:while(headCount != headAmt + 1)並在循環結束時增加它,以便在headCount通過每個標題時終止。在while循環中,我試圖通過並將每個段落添加到名爲items的ArrayList,然後獲取items arrayList中的內容,然後將其設置爲地圖中第一項的值。然後,清除ArrayList,轉到下一個段落,保存items中的內容,然後將該ArrayList設置爲地圖中第二個項目的值,依此類推。我有我可以發佈的代碼,但由於我無法正常工作,因此有問題的while循環被重新安排了很多次,這讓人感到困惑。Jsoup ArrayList和LinkedHashMap組合

編輯下面的情況下,任何人的代碼可以幫助:

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++; 
      } 
      } 
     } 
    } 
} 

回答

1

你可以嘗試這樣的事情:

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"); 
    } 
} 
} 
+0

我發佈的代碼 - 沒有得到掛在去年while循環。我知道這是錯誤的,我只是需要幫助修復它 –

+0

對不起,我恢復了代碼回到我的,但它仍然無法正常工作。任何幫助表示讚賞。我在這裏拉我的頭髮。 –

+1

@GD我編輯了我的答案。 – Titus