1

特定のページからのハイパーリンクを解析するために、次のコードを作成しました。

    WebClient web = new WebClient();
    string html = web.DownloadString("http://www.msdn.com");
    string[] separators = new string[] { "<a ", ">" };
    List<string> hyperlinks= html.Split(separators, StringSplitOptions.None).Select(s =>
    {
        if (s.Contains("href"))
            return s;
        else
            return null;
    }).ToList();

ただし、URL を完全に返すには、文字列の分割を微調整する必要があります。私の質問は、HTML 文字列を効率的に読み取ることができる、XmlReader などの行にあるデータ構造があることです。

上記のコードを改善するための提案も役に立ちます。

御時間ありがとうございます。

4

4 に答える 4

1

パーサーを使用する必要があります。最も広く使用されているのはHtmlAgilityPackです。これを使用して、HTML を DOM として操作できます。

于 2012-09-26T21:50:56.507 に答える
1

整形式の XHTML を扱っていると仮定すると、テキストを単純に XML ドキュメントとして扱うことができます。このフレームワークには、ユーザーが求めていることを正確に実行するための機能が搭載されています。

http://msdn.microsoft.com/en-us/library/system.xml.xmldocument.aspx

.NET フレームワークは、HTML 文字列を解析するメソッドを提供していますか?

于 2012-09-26T22:15:18.663 に答える
1

HtmlAgilityPackを試す

        HtmlWeb hw = new HtmlWeb();
        HtmlDocument doc = hw.Load("http://www.msdn.com");
        foreach (HtmlNode link in doc.DocumentNode.SelectNodes("//a[@href]"))
        {
            Console.WriteLine(link.GetAttributeValue("href", null));         
        }

これにより、URL のすべてのリンクが出力されます。

リンクをリストに保存したい場合:

 var linkList = doc.DocumentNode.SelectNodes("//a[@href]")
               .Select(i => i.GetAttributeValue("href", null)).ToList();
于 2012-09-26T22:15:43.310 に答える
0

リファクタリング、

        var html = new WebClient().DownloadString("http://www.msdn.com");
        var separators = new[] { "<a ", ">" };
        html.Split(separators, StringSplitOptions.None).Select(s => s.Contains("href") ? s : null).ToList();
于 2012-09-26T21:52:22.260 に答える