1

所以我试图从论坛中获取成员个人资料链接并将它们显示在控制台应用程序中。我想要做的是从网页中获取所有链接并将它们打印出来。

当前我正在获取这样的页面源:

String source = WebClient.DownloadString("URL");

我想要做的是遍历该字符串并找到这样的每个字符串:

<h3 class='ipsType_subtitle'>
         <strong><a href='http://www.website.org/community/user/8416-unreal/' title='View Profile'>!Unreal</a></strong>
</h3>

然后,一旦我得到那部分,我想像这样获得网址:

http://www.website.org/community/user/8416-unreal/

当前这是我尝试过的代码,它可以工作。但只抓取其中一个链接:

    WebClient c = new WebClient();
    String members = c.DownloadString("http://www.powerbot.org/community/members/");
    int times = Regex.Matches(members, "<h3 class='ipsType_subtitle'>").Count;
    Console.WriteLine(times.ToString());

    for (int i = 1; i < times; i++)
    {
        try
        {
            int start = members.IndexOf("<h3 class='ipsType_subtitle'>");
            members = members.Substring(start, 500);
            String[] next = members.ToString().Split(new string[] { "a href='" }, StringSplitOptions.None);
            String[] link = next[1].Split(' ');
            Console.WriteLine(link[0].Replace("'", ""));
        }
        catch(Exception e) { Console.WriteLine("Failed: " + e.ToString()); }
    }

    Console.Read();

谢谢。

4

4 回答 4

1
HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
doc.LoadHtml(members);

var links = doc.DocumentNode
    .Descendants("h3")
    .Where(h => h.Attributes["class"] != null && h.Attributes["class"].Value == "ipsType_subtitle")
    .Select(h => h.Descendants("a").First().Attributes["href"].Value)
    .ToArray();
于 2012-05-28T11:14:58.473 回答
0

您可以在下面找到您的代码,我对其进行了一些更改,现在应该可以了。但是你肯定没有为这个任务选择最好的方法。

WebClient c = new WebClient();
String members = c.DownloadString("http://www.powerbot.org/community/members/");
int times = Regex.Matches(members, "<h3 class='ipsType_subtitle'>").Count;
Console.WriteLine(times.ToString());

var member = string.Empty;//extracted value

for (int i = 1; i < times; i++)
{
    try
    {
        int start = members.IndexOf("<h3 class='ipsType_subtitle'>");
        member = members.Substring(start, 500);

        members = members.Remove(start, 500);

        String[] next = member.ToString().Split(new string[] { "a href='" }, StringSplitOptions.None);
        String[] link = next[1].Split(' ');
        Console.WriteLine(link[0].Replace("'", ""));
    }
    catch(Exception e) { Console.WriteLine("Failed: " + e.ToString()); }
}

Console.Read();
于 2012-05-28T11:24:08.877 回答
0

传递 HTML 的最正确方法是使用 HTML 解析器,例如 HtmlAgilityPack。您无法以其他方式正确传递HTML页面。

这就是“平衡育儿”概念的证明。您不能使用正则表达式解析((x))字符串,因为您需要记住解析树,但正则表达式是无状态构造。

它们还不错,但不适合这些类型的解析。

希望这可以帮助。

于 2012-05-28T11:02:52.890 回答
0

更好的方法是使用HTML Agility Pack

于 2012-05-28T11:01:17.750 回答