HtmlAgilityPack没有从HttpWebRequest返回的HTML中查找节点

时间:2014-06-19 20:25:25

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

我对htmlagilitypack有点新意。我想使用我的HttpWebRequest,它可以返回网页的html,然后使用htmlagilitypack解析该html。我希望找到具有特定类的所有div,然后获取div内所有内容的内部文本。这就是我到目前为止所拥有的。我的get请求成功返回网页html:

Public Function mygetreq(ByVal myURL as String, ByRef thecookie As CookieContainer)
        Dim getreq As HttpWebRequest = DirectCast(HttpWebRequest.Create(myURL), HttpWebRequest)
        getreq.Method = "GET"
        getreq.KeepAlive = True
        getreq.CookieContainer = thecookie
        getreq.UserAgent = "Mozilla/5.0 (Windows NT 6.3; WOW64; rv:29.0) Gecko/20100101 Firefox/29.0"

        Dim getresponse As HttpWebResponse
        getresponse = DirectCast(getreq.GetResponse, HttpWebResponse)


        Dim getreqreader As New StreamReader(getresponse.GetResponseStream())
        Dim thePage = getreqreader.ReadToEnd

        'Clean up the streams and the response.
        getreqreader.Close()
        getresponse.Close()


        Return thePage
    End Function

此函数返回html。然后我把html放到这个:

        'The html successfully shows up in the RichTextBox
        RichTextBox1.Text = mygetreq("http://someurl.com", thecookie)

        Dim htmldoc = New HtmlAgilityPack.HtmlDocument()

        htmldoc.LoadHtml(RichTextBox1.Text)

        Dim htmlnodes As HtmlNodeCollection
        htmlnodes = htmldoc.DocumentNode.SelectNodes("//div[@class='someClass']")


        If htmlnodes IsNot Nothing Then
            For Each node In htmlnodes
                MessageBox.Show(node.InnerText())
            Next
        End If

问题是,htmlnodes将以null的形式返回。所以最后的If Then循环不会运行。它什么也没找到,但我知道html页面中存在这个divclass的事实,因为我可以在RichTextBox1中看到html:

<div class="someClass"> This is inner text </div>

这究竟是什么问题? htmldoc.LoadHtml不喜欢mygetreq为页面html返回的字符串类型吗?

这与html实体有什么关系吗? thePage包含<>括号。他们没有权利。

我也看到有人发布here(C#)来使用HtmlWeb类,但我不确定如何设置它。我的大部分代码都是用httpWebRequest编写的。

感谢阅读和感谢帮助。

2 个答案:

答案 0 :(得分:1)

如果您愿意切换,可以使用CsQuery,其中包含以下内容:

Dim q As New CQ(mygetreq("http://someurl.com", thecookie))
For Each node In q("div.someClass")
  Console.WriteLine(node.InnerText)
Next

您可能想要添加一些错误处理,但总体而言应该是一个良好的开端。

您可以通过NuGet将CsQuery添加到您的项目中:

Install-Package CsQuery

不要忘记在代码文件的顶部使用Imports CsQuery

这可能无法直接解决您的问题,但应该可以更轻松地试验您的数据(例如,通过即时窗口)。

有趣的阅读(性能比较):

答案 1 :(得分:0)

使用html web确实是一种使用HtmlAgilityPack的简单而好的方法...这是一个例子:

Private Sub GetHtml()
    Dim HtmlWeb As New HtmlWeb
    Dim HtmlDoc As HtmlDocument
    Dim NodeCollection As HtmlNodeCollection
    Dim URL As String = ""
    HtmlDoc = HtmlWeb.Load(URL) 'Notice that i used load, and not LoadHtml
    NodeCollection=HtmlDoc.DocumentNode.SelectNodes(put here your XPath)
    For Each Node As HtmlNode In NodeCollection
        If IsNothing(Node) = False Then
            MsgBox(Node.InnerText)
        End If
    Next
End Sub