正则表达式去除重复的URL

3
我有一个包含URL集合的列表,类似于:
  1. somesite.com/index.php?id=12
  2. somesite.com/index.php?id=14
  3. somesite.com/index.php?id=156
  4. example.com/view.php?image=441
  5. somesite.com/page.php?id=1
  6. example.com/view.php?ivideo=4
  7. somesite.com/page.php?id=56
  8. example.com/view.php?image=1
这些被存储到一个列表中,在爬取过程中展示在一个列表视图中。我尝试了不同的正则表达式模式,但仍然无法得到我想要的结果,因为查询字符串成为了一个问题。
下面是我尝试的其中一种模式:
(http://?)(w*)(\.*)(\w*)(\.)(\w*)

让我写一下我需要过滤上述URL的方式。
  • somesite.com/index.php?id=12
  • example.com/view.php?image=441
  • somesite.com/page.php?id=1
  • example.com/view.php?ivideo=4
如您所见,相同但带有不同查询字符串的页面已被删除,这就是我想实现的。请注意,上述链接包含http://,但未包含在内,因为SOF将其视为垃圾邮件。有没有人可以帮帮我。提前致谢。

为什么 example.com/view.php?image=1 会匹配...根据你的例子,它匹配了 example.com/view.php?image=441 - Anirudha
2
你想用什么标准来筛选它们?有什么区别因素表明你正在尝试进行筛选? - Greg
@Some1.Kill.The.DJ 抱歉,我犯了一个错误。现在已经更正了。 - DriverBoy
你只需要第一个吗?你想要什么?看起来你只想要每个网站的第一个非连续URL。是这样吗? - Vrashabh Irde
参见你应该知道的8个正则表达式:“匹配URL”。 - JDB
@Slartibartfast 我不知道“non consecutive”是什么意思,但我不希望在列表中出现具有不同查询字符串的相同页面。希望你明白 :-) - DriverBoy
1个回答

2

不必手动解析Url,您可以使用Uri类和HttpUtility.ParseQueryString来进行解析。以下是一个示例,使用LINQ的.GroupBy方法将相似的url分组,然后从每个组中选择第一个url。

var distinctUrls = urls.GroupBy (u =>
    {
        var uri = new Uri(u);
        var query = HttpUtility.ParseQueryString(uri.Query);
        var baseUri = uri.Scheme + "://" + uri.Host + uri.AbsolutePath;
        return new {
            Uri = baseUri,
            QueryStringKeys = string.Join("&", query.AllKeys.OrderBy (ak => ak))
        };
    })
    .Select (g => g.First())
    .ToList();
distinctUrls 的示例输出如下:
http://somesite.com/index.php?id=12
http://example.com/view.php?image=441
http://somesite.com/page.php?id=1
http://example.com/view.php?ivideo=4

这也能正确处理两个 URL 查询参数集合相同但顺序不同的情况,例如 example.com/view.php?image=441&order=ascexample.com/view.php?order=desc&image=441 - 将其视为相似。

谢谢您的好意,我已经将我的URL集保存到列表“results”中。您能帮我实现这个解决方案吗? - DriverBoy
1
你需要在应用程序中包含库System.Web.dll。此外,你需要在代码文件的顶部导入System.LinqSystem.Web。然后,可以将上面的代码放入一个方法中,或者你可以只是用你的变量名替换urls.GroupBy,即results.GroupBy,它应该会给你所需的输出列表到distinctUrls,你可以使用它进行操作。 - mellamokb
谢谢,但是这行代码string.Join("&", query.AllKeys.OrderBy(ak => ak))仍然有错误。最佳重载方法匹配'string.Join(string, string[])'存在一些无效参数,并且编译器也提到:错误2 参数2:无法将'System.Linq.IOrderedEnumerable<string>'转换为'string[]'有没有什么方法可以解决这个问题?谢谢。 - DriverBoy
嗯,我测试的时候它是可以工作的。您可以尝试使用query.AllKeys.OrderBy(ak => ak).ToArray(),这样就可以传递一个数组了。 - mellamokb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接