Vb.net HttpWebRequest';返回的HTML

Vb.net HttpWebRequest';返回的HTML,vb.net,httpwebrequest,html-agility-pack,Vb.net,Httpwebrequest,Html Agility Pack,我对htmlagilitypack有点陌生。我想使用我的HttpWebRequest,它可以返回网页的html,然后用HtmlAlityPack解析该html。我想找到所有具有特定类的div,然后获取这些div中的内容的内部文本。这就是我目前所拥有的。我的get请求成功返回网页html: Public Function mygetreq(ByVal myURL as String, ByRef thecookie As CookieContainer) Dim getreq As

我对htmlagilitypack有点陌生。我想使用我的HttpWebRequest,它可以返回网页的html,然后用HtmlAlityPack解析该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
循环将不会运行。它什么也找不到,但我知道这个
div
class
存在于html页面中,因为我可以在RichTextBox1中看到html:

这是内部文本

这里到底有什么问题?
htmldoc.LoadHtml
是否与
mygetreq
为html页面返回的字符串类型不同

这与html实体有什么关系吗<代码>页面包含
括号。它们是不完整的

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


感谢您的阅读和帮助。

如果您愿意切换,您可以使用以下内容:

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

这可能不会直接解决您的问题,但会使您更容易试验数据(例如,通过即时窗口)

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


使用htmlweb确实是使用HTMLAlityPack的一种简单而好的方法……下面是一个示例:

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

一如既往,我建议使用CsQuery而不是HtmlAgilityPack。也被一个SO成员推荐,一旦尝试过,我就不想回去了。@Neolik从来没听说过。我只是一直听到HtmlAgilityPack。对于我正在尝试做的事情,您是否有现成的好的示例代码?=)在这里也是一样,我总是在尝试之前推荐HtmlAgilityPack。你知道jQuery吗?如果是,应该是一个简单的开关。我很快会给你举一些例子。@neolik是的,我知道Jquery/Javascript。非常感谢。我只是四处搜索CsQuery,而且大部分都是在C#中查找示例,因此VB.Net示例将非常棒=即使在我尝试CsQuery时,DHmm仍然不适用于我。我想知道这是否是
mygetreq
返回
page
的方式。它将所有内容转换为html实体,除了括号
页面的结果是否正常?我做得对吗?也就是说,它没有找到任何具有
div.somecClass
的节点。它说在我的错误检查中它是空的。我想这可能是因为我要查找的
div
在注释块中<代码>
所以它找不到它们?@MicroR:我不确定它在任何框架中都能像这样工作,因为在注释块中放置任何标记都会使它作为标记失效。您可能需要进行一些预处理,如文本替换,但这可能会导致更多问题,而不是解决问题。为什么要这样做,即解析注释中的标记?但是如何为POST和GET请求设置
HtmlWeb.Load()
的URL?如何为
HtmlWeb
指定现有cookie?在代码中,myURL是一个参数,因此您只需将myURL放在HtmlWeb.Load()中,然后使用XPath选择所需的标记。为什么要使用Cookie?你说“我想找到所有具有特定类的div,然后获取这些div的内部文本。”因为如果没有启用Cookie,我无法访问URL。我从我的
httpwebrequest
中预设了cookie,我必须使用这些cookie访问该站点。