【问题标题】:"Object reference not set to an instance of an object" and HtmlAgility“对象引用未设置为对象的实例”和 HtmlAgility
【发布时间】:2020-08-08 22:16:22
【问题描述】:

我有一个让我困惑的问题! 我想从网页中抓取一个值。 我找到了带有 chrome 和检查器的 xpath "//*[@id='GlobalTab0Elm']/div[2]/div[1]/div[2]/table/tbody/tr[7]/td[2]/div"

当我在 chrome (extension) 的 webscraper 中使用上面的 xpath 时,它工作正常。 但问题是这不适用于我的简单程序,您可以看到:

     Dim Handler As HtmlAgilityPack.HtmlWeb.PreRequestHandler = Function(request As HttpWebRequest)
                                                                       request.Headers(HttpRequestHeader.AcceptEncoding) = "gzip, deflate"
                                                                       request.AutomaticDecompression = DecompressionMethods.Deflate Or DecompressionMethods.GZip
                                                                       request.CookieContainer = New System.Net.CookieContainer()
                                                                       Return True
                                                                   End Function
        Dim webClient As HtmlWeb = New HtmlWeb()
        webClient.PreRequest = Handler


        webClient.UserAgent = "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.5) Gecko/20091102 Firefox/3.5.5"
        webClient.UseCookies = True

        Dim htmlDoc = webClient.Load("http://www.tsetmc.com/Loader.aspx?ParTree=15")
        htmlDoc.OptionReadEncoding = False
        Dim S As String
        S = "//*[@id='GlobalTab0Elm']/div[2]/div[1]/div[2]/table/tbody/tr[7]/td[2]/div"
        Dim node = htmlDoc.DocumentNode.SelectSingleNode(S)
    TextBox1.Text = (node.InnerText)

我的问题是为什么这个 xpath 可以在另一个刮板上工作,但它不能在这些代码上工作?我必须做什么? 错误发生在这一行:

TextBox1.Text = (node.InnerText)

错误文本是

Object reference not set to an instance of an object.

当我使用这个 xpath 时

"//*[@id='company_text']/text()[2]"

它找到了正确的 xpath 值。

我的问题是它不适用于这个 xpath。

"//*[@id='GlobalTab0Elm']/div[2]/div[1]/div[2]/table/tbody/tr[7]/td[2]/div"

【问题讨论】:

  • 表示该路径不存在。您确定您正在阅读相同的来源吗?
  • 感谢您的帮助。正是我在我的 vb.net 程序和网络爬虫扩展中使用了这个 xpath。在网络刮刀扩展上它工作正常,但在我的 vb.net 项目上它没有工作。
  • 您无法使用 WebClient 加载该页面,它是动态生成并不断更新的。在引发DocumentCompleted 事件后,使用WebBrowser 类(类,而不是Control)加载和呈现页面,然后将其传递给HAP。阅读此处的注释:How to get an HtmlElement value inside Frames/IFrames?,您将需要它。
  • Tnx 亲爱的 Jimi 我看到了那个链接。问题是我不知道 C# :D
  • 我发布的内容并非特定于 C#,其中的注释适用于任何 .Net 语言。重要的是您需要一个无头 WebBrowser 来加载和呈现文档,因为它是动态生成的(通过脚本)。该文档具有客户端渲染和服务器端(推送)更新。由于您可能需要数据的快照,因此您只需要关心客户端发生的情况。为此,您需要一个 WebBrowser 来执行脚本。此外,如注释中所述,请记住,您可以在主 Html 页面中拥有多个文档。

标签: vb.net html-agility-pack webscarab


【解决方案1】:

我找到了解决办法

 For Each li As HtmlNode In htmlDoc.DocumentNode.SelectNodes("//tbody")


            ArzeshNode = li.SelectSingleNode("//*[contains(@class,'table1')]/tbody/tr[7]/td[2]/div")   

        Next
msgbox( SplitValue((ArzeshNode.InnerText)) )

【讨论】:

  • 这不是答案。请点击您问题下方的编辑链接并将其添加到您的问题中,然后删除此答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-20
相关资源
最近更新 更多