Benutzer mit den meisten Antworten
URL aus Quelltext auslesen

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
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
- Bearbeitet Stefan FalzModerator Montag, 9. September 2013 21:20
- Als Antwort vorgeschlagen Stefan FalzModerator Donnerstag, 12. September 2013 12:37
- Als Antwort markiert Ionut DumaModerator Donnerstag, 10. April 2014 13:12
-
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
- Bearbeitet Stefan FalzModerator Dienstag, 10. September 2013 15:39
- Als Antwort vorgeschlagen Stefan FalzModerator Donnerstag, 12. September 2013 12:36
- Als Antwort markiert Ionut DumaModerator Donnerstag, 10. April 2014 13:12
Alle Antworten
-
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 -
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 -
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 -
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
-
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
- Bearbeitet Stefan FalzModerator Montag, 9. September 2013 21:20
- Als Antwort vorgeschlagen Stefan FalzModerator Donnerstag, 12. September 2013 12:37
- Als Antwort markiert Ionut DumaModerator Donnerstag, 10. April 2014 13:12
-
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
-
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
- Bearbeitet Stefan FalzModerator Dienstag, 10. September 2013 15:39
- Als Antwort vorgeschlagen Stefan FalzModerator Donnerstag, 12. September 2013 12:36
- Als Antwort markiert Ionut DumaModerator Donnerstag, 10. April 2014 13:12
-
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,
IonutIonut Duma, MICROSOFT
Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip„Entwickler helfen Entwickler“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.