Vb.net HttpWebRequest';返回的HTML
我对htmlagilitypack有点陌生。我想使用我的HttpWebRequest,它可以返回网页的html,然后用HtmlAlityPack解析该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
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
这可能不会直接解决您的问题,但会使您更容易试验数据(例如,通过即时窗口)
有趣的阅读(性能比较):
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访问该站点。