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。我的问题是有一些数据结构,类似于 XmlReader 的东西,它可以有效地读取 HTML 字符串。

任何改进上述代码的建议也会有所帮助。

谢谢你的时间。

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 回答