2015-11-06 74 views
-5

我使用jsoup解析HTML页面并提取与这些链接对应的链接和文本。避免结果中出现重复元素

我将链接作为值和文本存储为Map中的键。默认情况下,地图不应该允许我输入重复的元素,但在这里 我在结果中获取重复的元素。

任何人都可以帮我解决这个问题吗?这是我的代码。

public class ParseHtmlStrInHashMap { 
public static String linkText; 
public static String linkHref; 
public static int i = 1; 

public static Map<Set<String>, Set<String>> pageURLsAndText(Set<String> linkText, Set<String> linkHref) { 

    Map<Set<String>, Set<String>> map = new HashMap<Set<String>, Set<String>>(); 
    map.put(linkText, linkHref); 
    return map; 

    /*for(Map.Entry<String, String> entry : map.entrySet()) { 
     System.out.println("Key = "+entry.getKey()+", value = "+entry.getValue()); 
    }*/ 
} 

public static void main(String[] args) { 

    //ParseHtmlStrInHashMap phtml = new ParseHtmlStrInHashMap(); 

    Document doc = null; 
    try { 
    doc = Jsoup.connect("URL").get(); 
    } catch (IOException e) { 
    e.printStackTrace(); 
    } 

    Elements links = doc.select("a[href]"); 
    for (Element link : links) { 
    linkHref = link.attr("abs:href"); 
    linkText = link.text(); 

    if(linkText.isEmpty()) { 
     /*linkText = "Amazon"+i; 
     i++;*/ 

     if(linkHref.contains("=")) { 
     String arr[] = linkHref.split("="); 
     int j = arr.length-1; 
     linkText = arr[j]; 
     } 
     else { 
     String arr[] = linkHref.split("/"); 
     int j = arr.length-1; 
     linkText = arr[j]; 
     } 

    } 

    Set<String> setHref = new HashSet<String>(); 
    Set<String> setText = new HashSet<String>(); 
    setHref.add(linkHref); 
    //setText.add(linkText); 

    if(setText.contains(linkText)) { 
     linkText = linkText.concat(String.valueOf(i)); 
     i++; 
     setText.add(linkText); 
    } 
    else { 
     setText.add(linkText); 
    } 
    //System.out.println("Text = "+linkText+", URL = "+linkHref); 
    Map<Set<String>, Set<String>> map = pageURLsAndText(setText, setHref); 

    for(Map.Entry<Set<String>, Set<String>> entry : map.entrySet()) { 
    System.out.println("Key = "+entry.getKey()+", value = "+entry.getValue()); 
    } 
} 
} 
+4

这将有助于[减少样本代码,并显示输入和预期的输出] (http://stackoverflow.com/help/mcve)。 – yasd

回答

-1

看起来您正在尝试存储字符串是您的HashMap中的键值对。然而,你的HashMap没有设置存储字符串。

Map<Set<String>, Set<String>> map = new HashMap<Set<String>, Set<String>>(); 

修改HashMap来

Map<String, String> map = new HashMap<String, String>(); 

这将解决您的问题

+0

嗨Kabir,谢谢你的回复。我尝试了你告诉我的方式,但即使这给了我重复的钥匙..只是尝试与亚马逊作为网址.. –