当htmlDocument在函数内部创建时,函数有效,但当htmlDocument在外部创建并作为参数传递时,函数不起作用

时间:2017-01-22 16:20:44

标签: vb.net

首先是我的代码:

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,请告诉我。 感谢。

1 个答案:

答案 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())

这使文档保持不变。