首先是我的代码:
Imports HtmlAgilityPack
Public Class Form1
Public Property myPage As HtmlDocument
Private Sub btnStart_Click(sender As Object, e As EventArgs) Handles btnStart.Click
myPage = OpenDoc(txtURL.Text)
'Dim myPage As HtmlDocument = OpenDoc(txtURL.Text)
Dim tmp = NameGroup(myPage)
Dim tmp1 = NextPage(myPage) 'txtURL.Text)
'Dim tmp2 = ProvinceLinks(myPage)
'Dim tmp3 = CityLinks(myPage)
End Sub
Public Function OpenDoc(ByVal url As String) As HtmlDocument
If (url Is Nothing) Then Throw New ArgumentNullException("url")
Dim web As New HtmlWeb()
Dim document As HtmlDocument = web.Load(url)
Return document
End Function
Public Function NameGroup(ByVal document As HtmlDocument) As List(Of String)
Dim myNameGroup As New List(Of String)
If (Not document.DocumentNode Is Nothing) Then
Dim rootNode As HtmlNode = document.DocumentNode.SelectSingleNode("//table")
If (Not rootNode Is Nothing) Then
document.LoadHtml(rootNode.InnerHtml())
If (Not document.DocumentNode Is Nothing) Then
Dim node As HtmlNodeCollection = document.DocumentNode.SelectNodes("//tr//td//p//a")
For Each n In node
'Dim myProvince = n.InnerText
Dim myUrl = n.GetAttributeValue("href", String.Empty)
If Not String.IsNullOrEmpty(myUrl) Then myNameGroup.Add("https://411.ca" & myUrl)
Next
Return myNameGroup
End If
End If
End If
Return Nothing
End Function
Public Function NextPage(document As HtmlDocument) As String 'url As String) As String '
Dim myNextPage As String = Nothing
'If (url Is Nothing) Then Throw New ArgumentNullException("url")
'Dim web As New HtmlWeb()
'Dim document As HtmlDocument = web.Load(url)
If (Not document.DocumentNode Is Nothing) Then
Dim rootNode As HtmlNode = document.DocumentNode.SelectSingleNode("//body")
If (Not rootNode Is Nothing) Then
document.LoadHtml(rootNode.InnerHtml())
If (Not document.DocumentNode Is Nothing) Then
Dim node As HtmlNode = document.DocumentNode.SelectSingleNode("//*[@class='pagination']")
myNextPage = node.ChildNodes("a").GetAttributeValue("href", String.Empty)
Return myNextPage
End If
End If
End If
Return Nothing
End Function
OpenDoc函数通过提供HTMLDocument对象来工作。然后将此对象用作其他函数的参数。这样,每个URL只需访问一次互联网。
这适用于除一个功能之外的所有功能。我的NextPage函数不适用于此Function提供的文档对象。
如果您查看上面的NextPage函数,您将看到与OpenDoc函数中相同的代码,注释掉了。当我取消注释此代码并传递URL时,该函数可以正常工作。当我注释代码并将myPage对象参数作为属性或局部变量传递给NextPage时(您可以在局部变量旁边看到我的注释标记),NextPage函数不起作用。
NextPage函数传递它的“If(Not document.DocumentNode Is Nothing)然后”测试但是失败的“If(Not rootNode Is Nothing)然后”测试当我使用提供HTMLDocument对象的函数时。
btnStart Sub是我的功能测试子。注释掉的代码是有效的代码。 tmp和tmp1共享相同的参数。 tmp工作而tmp1没有。
我试图尽可能简洁,尽可能多地提供信息,而不是多余的。 人们会期望,如果它适用于所有人,那么反之亦然。我没有看到问题。有任何想法吗?如果您需要完整的代码和URL,请告诉我。 感谢。
答案 0 :(得分:0)
我的NameGroup函数正在修改HTMLDocument。
当NameGroup运行代码
时Dim rootNode As HtmlNode = document.DocumentNode.SelectSingleNode("//table")
Document.LoadHtml(rootNode.InnerHtml())
它会更改原始文档值。
我需要做的是将RootNode分配给新的htmldocument变量。 例如
Dim myDocument As New HtmlDocument
Dim rootNode As HtmlNode = document.DocumentNode.SelectSingleNode("//table")
myDocument.LoadHtml(rootNode.InnerHtml())
这使文档保持不变。