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

これらはリストに保存され、クロール プロセス後にリストビューに表示されます。さまざまな正規表現パターンを試しましたが、クエリ文字列が問題になったため、正確に必要なものをアーカイブできませんでした。

これは私が試したパターンの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

URLを手動で解析する代わりに、Uriクラスを利用HttpUtility.ParseQueryStringして解析を行うことができます。.GroupByLINQメソッドを使用して同様の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

example.com/view.php?image=441&order=ascこれは、2つのURLが同じクエリ文字列パラメータのセットを持っているが、となどの順序が異なる場合にも正しく処理さexample.com/view.php?order=desc&image=441れます。

于 2013-01-24T18:30:26.530 に答える