none
URL aus Quelltext auslesen RRS feed

  • Frage

  • Hallo,

    Ich habe ein Problem ich bekomme die URL nicht raus

        Private Sub BackgroundWorker5_DoWork(sender As Object, e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker5.DoWork
            Try
                Try
                    Try
                        Dim BukkitDatei As String = ".\Data\Bukkit.txt"
                        If My.Computer.FileSystem.FileExists(BukkitDatei) = True Then
                            Dim wc As New WebClient()
                            Dim content As String = wc.DownloadString("http://dl.bukkit.org/downloads/craftbukkit/") ' bzw. die Async-Version nutzen
    
                            Dim pos2 As Integer 'Mehrfach verwendet
                            Dim pos1 As Integer
                            Dim pos As Integer
                            pos = content.IndexOf("class=""downloadButton chan-rb  mini""") ' Zeile mit Versionsinfo finden
    
                            pos1 = content.IndexOf("<ahref=" & Chr(34), pos1) ' 1. Zelle finden
                            pos1 = content.IndexOf("<ahref=" & Chr(34), pos1) ' 2. Zelle finden
                            pos2 = content.IndexOf(Chr(34), pos1) ' Ende der 2. Zelle
    
                            Dim version As String = content.Substring(pos1 + 4, pos2 - pos1) 'Inhalt der Zelle ermitteln
                            Me.Invoke(Sub() My.Settings.rb = version) ' Synchron den Text ausgeben
                            My.Settings.Save()
                        End If
    
    
    
                    Catch ex As Exception
                        MsgBox(Err.Description)
                    End Try
                Catch ex As Exception
                    MsgBox(Err.Description)
                End Try
            Catch ex As Exception
    
            End Try
        End Sub

    Das was ich gerne bekommen würde steht auf : http://dl.bukkit.org/downloads/craftbukkit/

       <div class="downloadButton chan-rb  mini">
            <a
                    href="/downloads/craftbukkit/get/02169_1.5.2-R1.0/craftbukkit.jar"       = DIE URL DIE ICH GERNE HÄTTE
                    class="tooltipd"
                    title="Download CraftBukkit, version 1.5.2-R1.0">
                
                <small>Recommended Build</small>
                
                    
                        <span>1.5.2-R1.0</span>
                    
                
                <small>12.4 MB</small>
            </a>
            
                <div class="downloadButtonDetailTab">
                    <a href="/downloads/craftbukkit/view/02169_1.5.2-R1.0/" class="buildinfo tooltipd"
                       data-placement="below"
                       title="View artifact build information for 1.5.2-R1.0">(i)</a>
                </div>
            
        </div>

    Geht das irgendwie das Problem was ich glaube ich da habe ist dass ich die Anführungszeichen in ein String packen möchte oder???

    PS: Kann man eigentlich den Fortschritt eines solchen Background Workers auch in einer Progressbar wiedergeben?

    Wenn ich das so machen:

            Try
                ProgressBar3.Value = e.ProgressPercentage
                Label9.Text = e.ProgressPercentage.ToString + " %"
    
            Catch ex As Exception
    
            End Try

    Dann passiert da nie was

    PS: ENDE

    Sonntag, 8. September 2013 17:41

Antworten

  • Hi,

    Ich habe einfach überhaupt keine Ahnung diesbezüglich wie ich dass machen soll.

    wer hat dir denn dann den anderen Code geschrieben. Denn ganz ehrlich gesagt kann der nicht von dir sein, wenn Du das sehr einfache Beispiel in der MSDN zu Regex (das übrigens zu 95% genau das macht, was du haben willst) noch nicht mal ansatzweise verstehst.

    Was willst Du bspw. mit dem BackgroundWorker, der irgendwelche Meldungen per MessageBox ausgibt oder mit dem dreifach verschachtelten Try ... Catch Konstrukt, welches keinerlei Sinn ergibt?

    Ich fände es nett wenn ihr aus meinem Code einen Funktionstüchtigen machen könnt !

    Der Sinn und Zweck eines Forums ist nicht, dir fertigen Code vorzusetzen, sondern dir Hilfestellung bei Problemen/Fragen zu geben. Eigeninitiative und vor allem Lernbereitschaft muss beim Fragesteller vorhanden sein, sonst macht es weder Spaß noch Sinn, eine Antwort zu erstellen.

    Nachstehend der Code, mit dem Du alle Links aus der von dir genannten Seite auslesen und ausgeben kannst. Leg dafür eine neue Form in deinem Projekt an, nenn die "FormX" und füg einen Button "Button1" und eine TextBox "TextBox1" ein. Den Code kannst Du dann dort reinkopieren.

    Imports System.Net
    Imports System.Text
    Imports System.Text.RegularExpressions
    
    Public Class FormX
    
        Private Sub Button1_Click( sender As System.Object,  e As System.EventArgs) Handles Button1.Click
    
        Dim HtmlContent  As String
        Dim RegexPattern As String = "href\s*=\s*(?:[""'](?<1>[^""']*)[""']|(?<1>\S+))"
        Dim Matches      As MatchCollection
        Dim Regex        As Regex
        Dim LinkUrls     As New StringBuilder()
    
            HtmlContent = New WebClient().DownloadString( "http://dl.bukkit.org/downloads/craftbukkit/" )
            Regex       = New Regex( RegexPattern, RegexOptions.IgnoreCase Or RegexOptions.Multiline )
            Matches     = Regex.Matches( HtmlContent )
    
            For Each Match As Match In Matches
                LinkUrls.AppendLine( Match.Groups( 1 ) .Value )
            Next
    
            TextBox1.Text = LinkUrls.ToString()
    
        End Sub
    
    End Class

    Da der HTML Inhalt der von dir genannten Seite erheblich mehr Links beinhaltet als nur zwei, musst Du dir den passenden aber dann schon selbst raussuchen. Ggfs. ist es auch sinnvoll, mit deinem Code zuerst den DIV Container mit der Klasse "downloadButton chan-rb  mini" zu suchen (ggfs. auch per Regex) und die Regex Auswertung aus meinem Beispiel dann nur auf dessen Inhalt anzuwenden.

    Wenn Du den anderen Code, den Du gepostest hast, selbst geschrieben hast, sollte das problemlos von dir anwendbar sein. Falls nicht, hat das Ganz IMHO eher keinen Zweck.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community



    Montag, 9. September 2013 20:56
    Moderator
  • Und wie kann ich die Suche auf einen bestimmte Teil , in diesem Falle downloadButton chan-rb  mini beschränken???

    Na indem man aus dem Quelltext, den man per WebClient.DownloadString erhält, den relevanten Teil raussucht. Dafür könntest Du den von dir geposteten Code verwenden und den umschreiben.

    pos = HtmlContent.IndexOf("class=""downloadButton chan-rb  mini""") 

    passt ja dafür schon. Dann suchst Du bspw. noch den nächsten schließenden </div> Tag, merkst dir die Position bspw. in pos2

    pos2 = HtmlContent.IndexOf( "</div>", pos ) 

    und der Inhalt zwischen den beiden Positionen wäre dann der, den Du für den RegEx Ausdruck verwenden kannst.

    Matches = Regex.Matches( HtmlContent.SubString( pos, pos2 - pos ) )

    HTH


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community



    Dienstag, 10. September 2013 15:24
    Moderator

Alle Antworten

  • Hi,

    wenn Du öfter mal HTML Inhalte verarbeiten musst, würde ich dir das Html Agility Pack empfehlen.

      http://htmlagilitypack.codeplex.com/

    Wenn es nu darum geht, dass Du die Links gezielt auslesen willst, nimm Regex.

     http://msdn.microsoft.com/de-de/library/t9e807fx.aspx

    In deinem Code steht zudem "<ahref=". So steht das aber nicht im HTML Code. Zwischen a und href ist ein Leerzeichen.

    Zudem führt deine Variante dazu, dass bei einer Änderung der HTML Ausgabe, bspw. in <a id="Abc" class="..." href="..." ...> nichts mehr gefunden wird. Mit dem passenden Regex Ausdruck ist das kein Problem.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    Montag, 9. September 2013 07:11
    Moderator
  • Wie arbeite ich mit dem Html Agility Pack  oder Regex
    Montag, 9. September 2013 14:52
  • Wie arbeite ich mit dem Html Agility Pack  oder Regex

    Das steht in den Beispielen, die Du auf den verlinkten Seiten findest.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    Montag, 9. September 2013 16:07
    Moderator
  • Die verstehe ich aber irgendwie nicht !
    Montag, 9. September 2013 16:19
  • Hi,

    ähm. Zumindest das Beispiel für die Regex Verwendung ist sehr einfach und vor allen Dingen vollständig.

    Was genau verstehst Du denn daran nicht?

    Wenn Du uns mal zeigst, was Du schon selbst probiert hast und was genau nicht funktioniert bzw. was Du daran nicht verstehst, können wir dir sicher bei der Problemlösung helfen. "Grundlagenforschung" (bspw. die Grundzüge der Programmierung lernen, sich mit der Programmiersprachen an sich befassen, ...) musst Du aber schon selbst betreiben.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    Montag, 9. September 2013 16:28
    Moderator
  • Ich habe einfach überhaupt keine Ahnung diesbezüglich wie ich dass machen soll.

    Ich fände es nett wenn ihr aus meinem Code einen Funktionstüchtigen machen könnt !

     Private Sub BackgroundWorker5_DoWork(sender As Object, e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker5.DoWork
            Try
                Try
                    Try
                        Dim BukkitDatei As String = ".\Data\Bukkit.txt"
                        If My.Computer.FileSystem.FileExists(BukkitDatei) = True Then
                            Dim wc As New WebClient()
                            Dim content As String = wc.DownloadString("http://dl.bukkit.org/downloads/craftbukkit/") ' bzw. die Async-Version nutzen
                            ' Dim inputString As String = content
    
                            Dim pos2 As Integer 'Mehrfach verwendet
                            Dim pos1 As Integer
                            Dim pos As Integer
                            pos = content.IndexOf("class=""downloadButton chan-rb  mini""") ' Zeile mit Versionsinfo finden
    
                            pos1 = content.IndexOf("<a href=", pos1) ' 1. Zelle finden
                            pos1 = content.IndexOf("<a href=", pos1) ' 2. Zelle finden
                            pos2 = content.IndexOf("""", pos1) ' Ende der 2. Zelle
    
    
    
                            Dim r As New Regex("/index.php?action=captcha&entry_id=.*&key=.*")
                            Dim matches As MatchCollection = r.Matches(content)
    
                            For Each treffer As Match In matches
                                MsgBox(treffer.Value)
                            Next
    
                            Dim version As String = content.Substring(pos1 + 4, pos2 - pos1) 'Inhalt der Zelle ermitteln
    
                            Me.Invoke(Sub() My.Settings.rb = version) ' Synchron den Text ausgeben
    
                            Me.Invoke(Sub() MsgBox(Regex.Match(version, "href=")))
                            My.Settings.Save()
                        End If
    
                        ' & Chr(34)
    
                    Catch ex As Exception
                        MsgBox(Err.Description)
                    End Try
                Catch ex As Exception
                    MsgBox(Err.Description)
                End Try
            Catch ex As Exception
    
            End Try
        End Sub

    Montag, 9. September 2013 16:43
  • Hi,

    Ich habe einfach überhaupt keine Ahnung diesbezüglich wie ich dass machen soll.

    wer hat dir denn dann den anderen Code geschrieben. Denn ganz ehrlich gesagt kann der nicht von dir sein, wenn Du das sehr einfache Beispiel in der MSDN zu Regex (das übrigens zu 95% genau das macht, was du haben willst) noch nicht mal ansatzweise verstehst.

    Was willst Du bspw. mit dem BackgroundWorker, der irgendwelche Meldungen per MessageBox ausgibt oder mit dem dreifach verschachtelten Try ... Catch Konstrukt, welches keinerlei Sinn ergibt?

    Ich fände es nett wenn ihr aus meinem Code einen Funktionstüchtigen machen könnt !

    Der Sinn und Zweck eines Forums ist nicht, dir fertigen Code vorzusetzen, sondern dir Hilfestellung bei Problemen/Fragen zu geben. Eigeninitiative und vor allem Lernbereitschaft muss beim Fragesteller vorhanden sein, sonst macht es weder Spaß noch Sinn, eine Antwort zu erstellen.

    Nachstehend der Code, mit dem Du alle Links aus der von dir genannten Seite auslesen und ausgeben kannst. Leg dafür eine neue Form in deinem Projekt an, nenn die "FormX" und füg einen Button "Button1" und eine TextBox "TextBox1" ein. Den Code kannst Du dann dort reinkopieren.

    Imports System.Net
    Imports System.Text
    Imports System.Text.RegularExpressions
    
    Public Class FormX
    
        Private Sub Button1_Click( sender As System.Object,  e As System.EventArgs) Handles Button1.Click
    
        Dim HtmlContent  As String
        Dim RegexPattern As String = "href\s*=\s*(?:[""'](?<1>[^""']*)[""']|(?<1>\S+))"
        Dim Matches      As MatchCollection
        Dim Regex        As Regex
        Dim LinkUrls     As New StringBuilder()
    
            HtmlContent = New WebClient().DownloadString( "http://dl.bukkit.org/downloads/craftbukkit/" )
            Regex       = New Regex( RegexPattern, RegexOptions.IgnoreCase Or RegexOptions.Multiline )
            Matches     = Regex.Matches( HtmlContent )
    
            For Each Match As Match In Matches
                LinkUrls.AppendLine( Match.Groups( 1 ) .Value )
            Next
    
            TextBox1.Text = LinkUrls.ToString()
    
        End Sub
    
    End Class

    Da der HTML Inhalt der von dir genannten Seite erheblich mehr Links beinhaltet als nur zwei, musst Du dir den passenden aber dann schon selbst raussuchen. Ggfs. ist es auch sinnvoll, mit deinem Code zuerst den DIV Container mit der Klasse "downloadButton chan-rb  mini" zu suchen (ggfs. auch per Regex) und die Regex Auswertung aus meinem Beispiel dann nur auf dessen Inhalt anzuwenden.

    Wenn Du den anderen Code, den Du gepostest hast, selbst geschrieben hast, sollte das problemlos von dir anwendbar sein. Falls nicht, hat das Ganz IMHO eher keinen Zweck.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community



    Montag, 9. September 2013 20:56
    Moderator
  • Hi Tobpy,

    grundlegend sind die Leute hier im Forum aktive um den Leuten helfend unter dem Armen zu greifen damit sie selber ein Problem lösen können. Und ich denke für die meisten steht im Vordergrund Wissen zu vermitteln, weil sie selber mal die gleichen Probleme hatten und ihnen geholfen wurde oder sie einfach Spaß daran haben.  

    Einfach aus deinem Code was Funktionierendes zu machen, werden hier die wenigsten Leute machen. Und in anderen Foren noch viel weniger.

    Wenn du uns einfach erklärst, wo deine Probleme mit den Beispielen von Stefan sind, können wir dir sicher auch weiter helfen. Hier noch ein Linke wie man eine gute Frage Formuliert.

    MFG

    Björn

    Montag, 9. September 2013 21:28
  • Und wie kann ich die Suche auf einen bestimmte Teil , in diesem Falle downloadButton chan-rb  mini beschränken???
    Dienstag, 10. September 2013 15:11
  • Und wie kann ich die Suche auf einen bestimmte Teil , in diesem Falle downloadButton chan-rb  mini beschränken???

    Na indem man aus dem Quelltext, den man per WebClient.DownloadString erhält, den relevanten Teil raussucht. Dafür könntest Du den von dir geposteten Code verwenden und den umschreiben.

    pos = HtmlContent.IndexOf("class=""downloadButton chan-rb  mini""") 

    passt ja dafür schon. Dann suchst Du bspw. noch den nächsten schließenden </div> Tag, merkst dir die Position bspw. in pos2

    pos2 = HtmlContent.IndexOf( "</div>", pos ) 

    und der Inhalt zwischen den beiden Positionen wäre dann der, den Du für den RegEx Ausdruck verwenden kannst.

    Matches = Regex.Matches( HtmlContent.SubString( pos, pos2 - pos ) )

    HTH


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community



    Dienstag, 10. September 2013 15:24
    Moderator
  • DANKE :)
    Dienstag, 10. September 2013 15:34
  • Hallo Tobpy,

    Ich gehe davon aus, dass die Antwort Dir weitergeholfen hat.
    Wenn nicht, neue Rückfragen oder Ergänzungen zu diesem Thread bleiben weiterhin möglich.

    Danke und viele Grüße,
    Ionut


    Ionut Duma, MICROSOFT   Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-PrinzipEntwickler helfen Entwickler“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.

    Donnerstag, 10. April 2014 13:11
    Moderator