【问题标题】:HtmlAgilityPack NullReferenceException Error [duplicate]HtmlAgilityPack NullReferenceException 错误 [重复]
【发布时间】:2019-06-02 14:07:34
【问题描述】:

我正在尝试获取文本,但总是收到 NullReferenceException 错误。我快疯了。它工作了一会儿,但我又开始遇到这个错误。我会得到帖子标题的。

我尝试更改我的 XPath。我尝试了不同的 XPath。

    private void button1_Click(object sender, EventArgs e)
    {
        listView1.Items.Clear();

        for (int i = 4; i < 9; i++)
        {
            VeriAl(Url: "https://cracked.to/Forum-Combolists?sortby=started&order=desc&datecut=9999&prefix=0", XPath: "//table[@class='tborder clear']//tr[" + i + "]//td[2]//div[1]//span[1]//span[1]//a", tag: "title",CikanSonuc: listView1);
        }
    }

    public void VeriAl (String Url, String XPath, String tag,ListView CikanSonuc)
    {
        try
        {
            url = new Uri(Url);
        }
        catch (UriFormatException)
        {
            if (MessageBox.Show(text: "UriFormatException", caption: "Hata", buttons: MessageBoxButtons.OK, icon: MessageBoxIcon.Error) == DialogResult.OK)
            {

            }
        }
        catch (ArgumentNullException)
        {
            if (MessageBox.Show(text: "ArgumentNullException", caption: "Hata", buttons: MessageBoxButtons.OK, icon: MessageBoxIcon.Error) == DialogResult.OK)
            {

            }
        }

        WebClient client = new WebClient();
        try
        {
            html = client.DownloadString(url);
        }
        catch (WebException)
        {
            if (MessageBox.Show(text: "WebException", caption: "Hata", buttons: MessageBoxButtons.OK, icon: MessageBoxIcon.Error) == DialogResult.OK)
            {

            }
        }

        HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
        doc.LoadHtml(html);
        try
        {
            CikanSonuc.Items.Add(doc.DocumentNode.SelectSingleNode(XPath).Attributes[tag].Value);
        }
        catch (NullReferenceException)
        {
            if (MessageBox.Show(text: "NullReferenceException", caption: "Hata", buttons: MessageBoxButtons.OK, icon: MessageBoxIcon.Error) == DialogResult.OK)
            {

            }
        }

【问题讨论】:

  • 你有没有拔出获取值的命令并确保它实际上得到了一个值?
  • 请更新您的问题以包含html 的内容。另外请在您的问题中将CikanSonuc.Items.Add(doc.DocumentNode.SelectSingleNode(XPath).Attributes[tag].Value) 拆分为多行代码(每行在行尾都有;),以便每个操作中只有一个.。然后告诉我们哪一行抛出了异常。
  • 您尝试访问的 URL 在显示加载消息几秒钟后执行客户端重定向到自身。您尝试访问的表格实际上不在下载的 html 中,因为下载的 html 是加载页面。
  • 它不会直接到达您想要的页面。

标签: c# html-agility-pack


【解决方案1】:

问题是在您尝试获取 HTML 时内容不存在。 如果您调用 WebClient.DownloadString(),加载内容的 Javascript 代码不会被执行。获得完全加载的网页的唯一方法是使用 WebBrowser 控件加载页面并在加载完成后获取所有内容:

public static class WebViewExtension
{
    public static HtmlAgilityPack.HtmlDocument GetHtmlDocument(this WebBrowser wView)
    {
        HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
        doc.LoadHtml(wView.Document.Body.OuterHtml);
        return doc;
    }

    public static async Task<HtmlAgilityPack.HtmlDocument> LoadSiteAndGetHtml(this WebBrowser wView, string siteurl)
    {
        await wView.NavigateAndWait(siteurl);
        HtmlAgilityPack.HtmlDocument doc = wView.GetHtmlDocument();
        return doc;
    }

    public static async Task NavigateAndWait(this WebBrowser wView, string siteurl)
    {
        TaskCompletionSource<bool> loaded = new TaskCompletionSource<bool>();
        wView.Navigate(new Uri(siteurl));
        wView.DocumentCompleted += delegate (object sender, WebBrowserDocumentCompletedEventArgs args)
        {
            loaded?.TrySetResult(true);
        };

        //wait until the website is loaded
        await loaded.Task;
    }
}

您可以像这样使用这些方法:

    WebBrowser client = new WebBrowser();
    try
    {
        HtmlDocument doc = await client.LoadSiteAndGetHtml(url);
    }
    catch (WebException)
    {
        if (MessageBox.Show(text: "WebException", caption: "Hata", buttons: MessageBoxButtons.OK, icon: MessageBoxIcon.Error) == DialogResult.OK)
        {

        }
    }

【讨论】:

    【解决方案2】:

    URL - https://cracked.to/Forum-Combolists?sortby=started&order=desc&datecut=9999&prefix=0 会显示加载屏幕几秒钟,然后重定向到它自己,向您显示您想要查看的内容。在重定向之前,它还会设置一些浏览器 cookie,这样您就不会再次看到加载屏幕而是看到内容。重定向是使用脚本的客户端。

    当您在 C# 中尝试下载页面时,它实际上是在下载该加载页面的源代码,而不是实际内容。您下载的 HTML 甚至没有您尝试访问的元素,因此出现空引用异常。

    解决这个问题将非常棘手,因为这是一个客户端重定向。您甚至可能会使用浏览器实例抓取网页,以便在重定向后检索 html。大概是这样的Scraping webpage generated by JavaScript with C#

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-11-01
      • 2016-03-02
      • 2012-08-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多