HtmlAgilitypack SelectSingleNode "System.NullReferenceException"

HtmlAgilitypack SelectSingleNode "System.NullReferenceException"

这是我的代码:

var html = webBrowser1.DocumentText;

            HtmlWeb web = new HtmlWeb();

            var htmlDoc = new HtmlAgilityPack.HtmlDocument();
            htmlDoc.LoadHtml(html);

            var node = htmlDoc.DocumentNode.SelectSingleNode("/html/body/div/div/div/div/section/section/div/div/div/div").Attributes["class"].Value;


            Console.WriteLine("Node Name: " + node);

到目前为止一切正常,但是如果我在 "SelectSingleNode" 中添加一个“/ div”,那么它将无法正常工作(错误消息:"Exception thrown:" System.NullReferenceException ""),尽管那里的 HTML 代码中还有另一个 "div"。

我认为是因为在下一个"div"之前的HTML代码中有一个“:: before”,但前提是我在浏览器中分析它

部分HTML代码:

 <div class="un-page__body">
    <div class="container-fluid">
       ::before
    <div class="row">
       ::before
       <div class="col-sm-6">

当您使用 F12 / 开发工具查看 HTML 时,HTML 您看到的与您在 HtmlAgilityPack 或任何其他网络抓取工具中看到的非常不同。

原因

您的代码不起作用,也不会起作用,因为整个文档中只有两个 div 标记。 /html/body/div 会起作用,因为其中有两个,仅此而已。剩下的只是 js 个脚本。

当您在 chrome 中加载 URL 时,chrome 编译数据,执行脚本,然后呈现它呈现的数据以向您展示您应该看到的内容.

您提供的 URL 在其主体中只有脚本可以执行并生成您在 Dev / Tools 中看到的 divs,此时,HTML Agility Pack无法执行脚本并呈现已编译的 HTML 供您浏览。

您在 HTMLAgilityPack

中得到了什么

当你查看doc.DocumentNode中的代码时,你只会看到这个

<div id="app">
    WebUntis wird geladen ...
</div>

Chrome / IE 将加载其他内容,因为那是在编译/渲染之后。您想要做的是 运行 HTMLAgilityPack 中的脚本.. 这不是您目前可以做的事情。

您在 Chrome / 浏览器中看到的内容

<div id="app">
    <div style="height: 100%;">
        <div class="un-app">
            <nav class="un-app-header navbar navbar-default">
                <div class="container-fluid">
...