VB.net Abrufen des InnerText von href mit HtmlAgilityPack

href html-agility-pack innertext vb.net

Frage

Ich habe jetzt meinen Code aktualisiert (Danke Tim, dass er mir geholfen hat zu lernen), der bereits funktioniert, aber es gibt mir nicht die richtigen Links, die ich will.

Hier ist mein Arbeitscode:

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim webClient As New System.Net.WebClient
        Dim WebSource As String = webClient.DownloadString("http://www.google.com.ph/search?hl=en&as_q=test&as_epq=&as_oq=&as_eq=&as_nlo=&as_nhi=&lr=&cr=countryCA&as_qdr=all&as_sitesearch=&as_occt=any&safe=images&tbs=ctr%3AcountryCA&as_filetype=&as_rights=#as_qdr=all&cr=countryCA&fp=1&hl=en&lr=&q=test&start=20&tbs=ctr:countryCA")

    Dim doc = New HtmlAgilityPack.HtmlDocument()
        doc.LoadHtml(WebSource)
        Dim links = GetLinks(doc, "test")
        For Each Link In links
            ListBox1.Items.Add(Link.ToString())
        Next
    End Sub


   Public Class Link
        Public Sub New(Uri As Uri, Text As String)
            Me.Uri = Uri
            Me.Text = Text
        End Sub
        Public Property Text As String
        Public Property Uri As Uri

        Public Overrides Function ToString() As String
            Return String.Format(If(Uri Is Nothing, "", Uri.ToString()))
        End Function
    End Class


    Public Function GetLinks(doc As HtmlAgilityPack.HtmlDocument, linkContains As String) As List(Of Link)
        Dim uri As Uri = Nothing
        Dim linksOnPage = From link In doc.DocumentNode.Descendants()
                          Where link.Name = "a" _
                          AndAlso link.Attributes("href") IsNot Nothing _
                          Let text = link.InnerText.Trim()
                          Let url = link.Attributes("href").Value
                          Where url.IndexOf(linkContains, StringComparison.OrdinalIgnoreCase) >= 0 _
                          AndAlso uri.TryCreate(url, UriKind.Absolute, uri)

        Dim Uris As New List(Of Link)()
        For Each link In linksOnPage
            Uris.Add(New Link(New Uri(link.url, UriKind.Absolute), link.text))
        Next

        Return Uris
    End Function

Ich bin derzeit neu in diesem HtmlAgilityPack, ich lerne immer noch bitte bitte mit mir.

Mein Hauptziel:

Beispiellink: http://www.google.com.ph/search?hl=en&as_q=test&as_epq=&as_oq=&as_eq=&as_nlo=&as_nhi=&lr=&cr=countryCA&as_qdr=all&as_sitesearch=&as_occt=any&safe=images&tbs=ctr%3AcountryCA&as_filetype=&as_rights=#as_qdr=all&cr=countryCA&fp=1&hl=en&lr=&q=test&start=20&tbs=ctr:countryCA

Meine erwarteten Linkausgaben, die das Wort "test" enthalten:

www.copetest.com/‎
www.testofhumanity.com/
www3.algonquincollege.com/testcentre/‎
www.lpitest.ca/‎
testtube.nfb.ca/‎
www.ieltscanada.ca/testdates.jsp‎
https://www.awinfosys.com/eassessment/fsa_fieldtest.htm‎

Akzeptierte Antwort

Sie sollten stattdessen das Attribut href verwenden. Beachten Sie auch, dass .NET standardmäßig die Groß- / Kleinschreibung beachtet

For Each link As HtmlNode In htmlDoc.DocumentNode.SelectNodes("//a[@href]")
   Dim href = link.Attributes("href").Value
   If href.IndexOf("test", StringComparison.OrdinalIgnoreCase) >= 0 Then
       ListBox1.Items.Add(href)
       ' or
       ListBox1.Items.Add(link.InnerText)
   End If
Next 

Hier ist eine Methode, die alle Links in einem Dokument als List(Of Link) . Link ist eine benutzerdefinierte Klasse mit zwei Eigenschaften, eine für den Text und die andere für die Uri :

Public Class Link
    Public Sub New(Uri As Uri, Text As String)
        Me.Uri = Uri
        Me.Text = Text
    End Sub
    Public Property Text As String
    Public Property Uri As Uri

    Public Overrides Function ToString() As String
        Return String.Format("{0} [{1}]", Text, If(Uri Is Nothing, "", Uri.ToString()))
    End Function
End Class

Public Function GetLinks(doc As HtmlAgilityPack.HtmlDocument) As List(Of Link)
    Dim uri As Uri = Nothing
    Dim linksOnPage = From link In doc.DocumentNode.Descendants()
                      Where link.Name = "a" _
                      AndAlso link.Attributes("href") IsNot Nothing _
                      Let text = link.InnerText.Trim()
                      Let url = link.Attributes("href").Value
                      Where uri.TryCreate(url, UriKind.Absolute, uri)

    Dim Uris As New List(Of Link)()
    For Each link In linksOnPage
        Uris.Add(New Link(New Uri(link.url, UriKind.Absolute), link.text))
    Next

    Return Uris
End Function

Hier ist die angeforderte Überladung, die überprüft, ob eine URL einen gegebenen Text enthält:

Public Function GetLinks(doc As HtmlAgilityPack.HtmlDocument, linkContains As String) As List(Of Link)
    Dim uri As Uri = Nothing
    Dim linksOnPage = From link In doc.DocumentNode.Descendants()
                      Where link.Name = "a" _
                      AndAlso link.Attributes("href") IsNot Nothing _
                      Let text = link.InnerText.Trim()
                      Let url = link.Attributes("href").Value
                      Where url.IndexOf(linkContains, StringComparison.OrdinalIgnoreCase) >= 0 _
                      AndAlso uri.TryCreate(url, UriKind.Absolute, uri)

    Dim Uris As New List(Of Link)()
    For Each link In linksOnPage
        Uris.Add(New Link(New Uri(link.url, UriKind.Absolute), link.text))
    Next

    Return Uris
End Function

Editiert jetzt getestet, funktioniert, benutze es wie folgt:

Dim site = File.ReadAllText("C:\Temp\website_test.htm")
Dim doc = New HtmlAgilityPack.HtmlDocument()
doc.LoadHtml(site)
Dim links = GetLinks(doc)
For Each Link In links
    ListBox1.Items.Add(Link.ToString())
Next


Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum