删除由JSoup抓取检索的重复元素

时间:2018-01-24 01:18:45

标签: java web-scraping jsoup

在我的抓取功能中,我检索DOM中存在的链接。

Elements links = doc.getElementsByTag("a");

for (Element link : links) {
    String linkHref = link.attr("href");
    if(linkHref.contains("/blog/")){
        System.out.print("Link: " + linkHref + "\n");
    }
}

这很有效。

我想知道的是删除Elements对象中的重复链接

有可能吗?如果没有,我会很容易找到一个使用字符串数组的解决方法,但我更喜欢惯用的解决方案。

谢谢

2 个答案:

答案 0 :(得分:3)

您可以使用Hello world实现此目的。 HashSet是一个存储唯一元素集的数据结构,因此如果有重复的链接,您将无法在HashSet中使用它们。

HashSet

答案 1 :(得分:1)

JSOUP从DOM中提取的元素彼此不相等,即使它们包含完全相同的标记,属性和值。这确实造成了过去的混乱,并且被简要地改变了,然后我记得更加混乱(见https://github.com/jhy/jsoup/issues/561

所以你应该在JSOUP之外使用解决方案。根据您实际考虑的相同元素,您可以使用适当的东西填充HashSet。如果if是JSOUP锚元素的所有属性和值,那么您需要做一些额外的工作,以防您无法保证HTML元素中属性的顺序。所以你可以这样做:

Initialize a HashSet
for each link Element:
extract all properties and values
sort the properties
concatenate to each property its value
concatenate all perperty-value strings
see if the perperty-value string is contained in your Hashset
if yes you found a new Element, so put it in the HashSet and do whatever you want
continue with next Elememnt