Html Agility Pack帮助

10
我正在尝试从一个网站上爬取一些信息,但无法找到适合我的解决方案。我在网上阅读的每一段代码都至少会给我生成一个错误。甚至他们主页上的示例代码也为我生成错误。
我的代码:
         HtmlDocument doc = new HtmlDocument();
         doc.Load("https://www.flashback.org/u479804");
         foreach(HtmlNode link in doc.DocumentElement.SelectNodes("//a[@href"])
         {
            HtmlAttribute att = link["href"];
            att.Value = FixLink(att);
         }
         doc.Save("file.htm");

出现以下错误:

'HtmlDocument'是一个模糊的引用,可以是'System.Windows.Forms.HtmlDocument'或者'HtmlAgilityPack.HtmlDocument' C:*\Form1.cs

编辑:我的整个代码在这里:http://beta.yapaste.com/55

非常感谢所有帮助!


正如我在下面的回复中提到的,我无法真正理解你想要做什么。如果您能更详细地描述您尝试实现的任务,我将尝试帮助您编写一个样例应用程序来实现它。 - rtpHarry
我认为你可以使用“HtmlAgilityPack.HtmlDocument”代替“HtmlDocument”来消除编译器的警告。 - B. Clay Shannon-B. Crow Raven
啊,原来是那个"using HtmlDocument = System.Windows.Forms.HtmlDocument;"不知何故被添加到了我的usings子句中,导致HtmlAgilityPack版本的HtmlDocument类被遮蔽了。 - B. Clay Shannon-B. Crow Raven
4个回答

10

使用HtmlAgilityPack.HtmlDocument

HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
编译器混淆了两个你使用 using 导入的命名空间中都包含名为HtmlDocument的类,即HTML Agility Pack命名空间和Windows Forms命名空间。你可以通过明确指定要使用哪个类来解决这个问题。

然后我又遇到了另一个错误: 'HtmlAgilityPack.HtmlDocument' 不包含 'DocumentElement' 的定义,也没有接受类型为 'HtmlAgilityPack.HtmlDocument' 的第一个参数的扩展方法 'DocumentElement' 可用(是否缺少 using 指令或程序集引用?) - Victor Bjelkholm
嗯...我不确定。你贴入的代码似乎没有问题...也许其他地方出错了? - Lucas Jones
有没有其他的方法可以使用C#从网站上获取信息? - Victor Bjelkholm
你正在使用的库是我所知道的最好的方法来实现你想要做的事情... 你可以尝试创建一个新项目,并仅执行最少必要的操作以使示例代码工作。或者,如果它包含完整的示例应用程序,请查看您的代码与其之间是否存在任何差异。 - Lucas Jones

4

这是我实现的方法。请注意,在主函数中,Html Agility Pack 示例 中的 foreach 行代码存在错误。下面提供了正确且经过测试的代码。

 HtmlWeb hw = new HtmlWeb();

    HtmlDocument doc = hw.Load(@"http://adityabajaj.com");
    StringBuilder sb = new StringBuilder();

    List<string> lstHref = new List<string>();

    foreach (HtmlNode link in doc.DocumentNode.SelectNodes("//a[@href]").Distinct())
    {
        string curHref = link.Attributes["href"].Value;

        if(!lstHref.Contains(curHref))
        lstHref.Add(curHref);

    }
    foreach (string str in lstHref)
    {
        sb.Append(str +"<br />");
    }

    Response.Write (sb.ToString());

自从这个方法对我有用之后,我觉得我应该分享一下。


2
两个命名空间中的类 System.Windows.FormsHtmlAgilityPack 发生了冲突。请使用完全限定的类型名称或使用命名空间别名。

那没怎么帮到我,您能再详细解释一下我该怎么做吗? - Victor Bjelkholm

1

我写了几篇文章来介绍如何使用HtmlAgilityPack。你可能会发现它们很有用,可以帮助你入门:

警告(2012-06-08):此链接有点垃圾 - 不良的弹出广告,内容不多。

我不知道他们现在是否已经修复了,但是那个片段以前在网站首页上不起作用,我认为它来自库的早期版本。此外,片段没有定义FixLink(),因此即使对于该库而言是正确的,它也无法工作。

我建议获取最新的库beta版本,因为它具有额外的扩展,可针对其执行linq查询,这可以避免您以后混淆xpath查询。

我以前没有看到它在Windows Forms应用程序中使用过,但是看起来您将不得不使用完全限定的类型名称,例如:

HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();

关于您要执行的实际任务,似乎您想要获取一个URL,将用户名和ID注入其中,然后...不确定?您似乎既想将文件保存到磁盘中,又想将HTML代码设置为表单内容的内容,但我认为这是不可能做到的。

@tomfanning - 感谢您的通知,似乎其中一个小部件正在向用户发送垃圾邮件。我已经移除了PostRank和Blogged.com小部件,现在不再看到垃圾邮件弹出窗口了。 - rtpHarry

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接