我对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页面中存在这个div
和class
的事实,因为我可以在RichTextBox1中看到html:
<div class="someClass"> This is inner text </div>
这究竟是什么问题? htmldoc.LoadHtml
不喜欢mygetreq
为页面html返回的字符串类型吗?
这与html实体有什么关系吗? thePage
包含<
和>
括号。他们没有权利。
我也看到有人发布here(C#)来使用HtmlWeb
类,但我不确定如何设置它。我的大部分代码都是用httpWebRequest
编写的。
感谢阅读和感谢帮助。
答案 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