【问题标题】:How to parse through website HTML content如何解析网站 HTML 内容
【发布时间】:2013-09-15 19:10:06
【问题描述】:

我正在尝试解析网站的 HTML,比如 CNN.com,但每次我使用 WebBrowser 对象导航时,我的对象都会得到一堆空值。我没有使用 HTML 敏捷包。每当我调用 Navigate 方法时,mywebBrowser 都包含 null 和空白值。如何让 tagCollection 填充?我尝试执行 webClient.DownloadString 只是为了获取 HTML 页面的所有内容,但我不能使用它,因为我需要找到所有标签并且手动执行非常麻烦。我也不能使用 HTML Agility Pack。

        using (WebClient webClient = new WebClient())
        {
            webClient.Encoding = Encoding.UTF8;
            HtmlString = webClient.DownloadString(textBox1.Text);
        }

        WebBrowser mywebBrowser = new WebBrowser();
        Uri address = new Uri("http://www.cnn.com/");
        mywebBrowser.Navigate(address);

        //HtmlString does contain all the HTML from Page
        mywebBrowser.DocumentText = HtmlString; 
        //DocumentText only has "<HTML></HTML> after assignment


        HtmlDocument doc = mywebBrowser.Document;
        HtmlElementCollection tagCollection;
        tagCollection = doc.GetElementsByTagName("<div");

【问题讨论】:

  • 为什么不能使用 HtmlAgilityPack?
  • @DGibbs 我认为 OP 在不能使用 HtmlAgilityPack 方面非常清楚:) (原因听起来不太重要)。只是,出于好奇,也许是因为我将 WebBrowser 用于非常具体的任务,但我不确定使用 HthmlAgilityPack 的原因。你能解释一下 HtmlAgilityPack 能做什么而 WebBrowser 不能吗?
  • @varocarbas 他当然很清楚。然而,不清楚的是为什么他不能使用这个库。如果您需要解析 HTML,那么它非常适合这项工作,并且您最好有充分的理由不选择它而不是其他不太成功的方法...
  • @DGibbs 我确实理解您的担忧,这就是我写“(原因听起来不太重要)。”的原因。你一直说它更好,我的问题是为什么它更好?我并不是说这不是更好,只是要求提供更多信息(如果您可以/想要提供它)。通过依赖 WebBrowser 的 HtmlElementCollection 来遍历任何 html 元素,我从来没有遇到过任何问题(如原始代码或我的回答中所示),所以我不确定为什么 HtmlAgilityPack 更好(至少在这方面) .
  • 我想避免任何许可问题

标签: c# html parsing browser dom


【解决方案1】:

WebBrowser Class 允许您做很多事情,而无需依赖任何外部库。你缺少的是DocumentCompleted Event;它是 WebBrowser 基本定义的一部分:在到达这部分之前,页面没有完全加载,因此相应的信息是错误的(或为空)。还要记住,在GetElementsByTagName 中,您只需输入标签的名称(不带“

 WebBrowser mywebBrowser;
 private void Form1_Load(object sender, EventArgs e)
 {
     mywebBrowser = new WebBrowser();
     mywebBrowser.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(mywebBrowser_DocumentCompleted);

     Uri address = new Uri("http://www.cnn.com/");
     mywebBrowser.Navigate(address);
 }

 private void mywebBrowser_DocumentCompleted(Object sender, WebBrowserDocumentCompletedEventArgs e)
 {
    //Until this moment the page is not completely loaded
     HtmlDocument doc = mywebBrowser.Document;
     HtmlElementCollection tagCollection;
     tagCollection = doc.GetElementsByTagName("div");
 }

【讨论】:

  • 虽然我发现我必须交换声明句柄和调用 Navigate() 的顺序,但这很有效
  • @fifamaniac04 我不确定我是否在关注您:此代码在我的计算机上运行良好并且没问题(因此应该在任何计算机上运行)。 DocumentCompleted 事件可以在任何时候关联(在 mywebbrowser 被实例化之后和调用 .Navigate 方法之前)。方法的确切顺序(DocumentedCompleted 位于 Form1_Load 之前或之后)并不重要。您能否详细说明您遇到的确切问题,以便我可以解释任何不清楚的地方?
  • idk,我升级了它,因为它引导我找到了解决方案。我意识到它应该可以在任何计算机上工作,我只是交换了我的,对我来说,我们在导航到页面后为 DocCompleted 事件创建句柄然后点击它确实很有意义。顺序没有意义。我认为您的代码应该在任何组合上都可以正常工作,但在我交换订单之前它并没有在我的上运行。不确定我在其他文件中是否缺少某些东西。但很有帮助
  • @fifamaniac04 我向您询问了更多信息,但您没有解释任何内容:您不需要更改任何内容。你能显示你的新代码吗?你说的交换是什么意思?我正在从 Load 事件创建一个 webBrowser(并向它添加一个 DocumentCompleted 事件)......就是这样,没有订单问题,我不知道你在说什么。但是,您应该尝试解释您的观点(顺便说一句,我提供的内容),而不是-1,以确保您正确理解所有内容。这就是重点:您要求学习。
  • @fifamaniac04 如果您认为您发现了我的解决方案中缺少的重要内容,请记住这不是您和我之间的事情,而是其他有同等问题的人。您应该告诉我到底哪里错了,这样我可以更正我的答案,或者将您自己的更正答案发布给其他人(如果认为正确,他们最终可能会投票给您)。但是,这一切的反对意见从何而来?你在帮谁?无论如何...
猜你喜欢
  • 2014-02-05
  • 1970-01-01
  • 1970-01-01
  • 2018-07-17
  • 1970-01-01
  • 1970-01-01
  • 2019-11-10
  • 1970-01-01
  • 2014-08-13
相关资源
最近更新 更多