3

我有一个列表,其中包含一组类似于

  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。

  1. somesite.com/index.php?id=12
  2. example.com/view.php?image=441
  3. somesite.com/page.php?id=1
  4. example.com/view.php?ivideo=4

如您所见,相同但具有不同查询字符串的页面已被删除。这就是我要归档的内容。请注意,上面的链接确实包含http://,但由于 SOF 将它们视为垃圾邮件,因此没有包含它们。任何人都可以帮助我解决这个问题。提前致谢。

4

1 回答 1

2

您可以使用Uri该类并HttpUtility.ParseQueryString进行解析,而不是手动解析 Url。这是一个使用 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- 将它们视为相似。

于 2013-01-24T18:30:26.530 回答