Du bist nicht angemeldet.

Dodo

Super Moderator

  • »Dodo« ist der Autor dieses Themas

Beiträge: 4 961

Dabei seit: 5. Oktober 2008

Wohnort: Berlin

Hilfreich-Bewertungen: 586

  • Private Nachricht senden

1

Montag, 15. Juni 2009, 10:52

Etwas aus dem HTML Quelltext auslesen mit HTTPWebRequest & RegEx

Da ja immer wieder gefragt wird, wie man etwas aus einem Quelltext rausließt, habe ich hier mal ein kleines Beispiel gemacht.
Zum einen nutze ich den HTTPWebRequest, welcher besser geeignet ist als das WebBrowser Control und statt bei einer bestimmten Zeichenkette zu Splitten nutze ich hier die deutlich professionelleren Regular Expressions. Leider wird ja bisher noch nicht auf allen Seiten der W3C Standard angewendet, denn würde dies der Fall sein, könnte man viel mehr Informationen einfach auslesen, wenn DIV Container IDs haben.

Bei meinem Beispiel nutze ich folgende PHP Datei:

PHP-Quelltext

1
2
3
4
5
6
7
8
9
10
11
<html>
<head>
<title>VB-Testseite</title>
</head>

<body>
<div id="myip"><?=$_SERVER['REMOTE_ADDR']?></div>

<div id="sqlcollection">Fred;Bochum;32,Alex;Berlin;21,Jeanine;Hamburg;16</div>
</body>
</html>


Und hier der VB-Code:

Visual Basic Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
Imports System.Net
Imports System.IO
Imports System.Text.RegularExpressions
Public Class Form1
Dim peoples() As String

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    Dim httpRequest As HttpWebRequest = HttpWebRequest.Create("http://server.de/test.php")
    Dim httpResponse As HttpWebResponse = httpRequest.GetResponse()
    Dim reader As StreamReader = New StreamReader(httpResponse.GetResponseStream)
    Dim httpContent As String = reader.ReadToEnd

    txtSourcecode.Text = httpContent

    Dim ipRegEx As New Regex("\<div id=\""myip\""\>(?<string>(.*))\<\/div\>")
    Dim myIP As String = ipRegEx.Match(httpContent).Groups("string").ToString()

    lblIP.Text = "Deine IP: " & myIP

    Dim peopleRegEx As New Regex("\<div id=\""sqlcollection\""\>(?<string>(.*))\<\/div\>")
    Dim sqlcollection As String = peopleRegEx.Match(httpContent).Groups("string").ToString()
    peoples = sqlcollection.Split(",")

    For Each sqlLine In peoples
        Dim sqlCells() As String = sqlLine.Split(";")

        lstPeoples.Items.Add(sqlCells(0))
    Next

End Sub

Private Sub lstPeoples_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles lstPeoples.SelectedIndexChanged
    Dim sqlCells() As String = peoples(lstPeoples.SelectedIndex).Split(";")
    lblPeopleInfo.Text = "Wohnort: " & sqlCells(1) & vbNewLine & "Alter: " & sqlCells(2)
End Sub
End Class


Kleine Info zu den RegEx Pattern:
Mit (?<name>(pattern)) kann man einen Gruppennamen festlegen, wobei name durch etwas beliebiges, eindeutig identifizierbares ersetzt werden kann. Ich habe die Gruppe "string" genannt und später beim Match sieht man ja das ich via .Group("string") dann auf eben diese Gruppe wieder zugreife. Dies ist vorallem von vorteil, wenn man im RegEx Pattern mehrere Infos haben möchte, z.B.:
Von <div id="test" class="außen">inhalt</div> möchte ich nun den KlassenNamen und Inhalt bekommen, also würde mein PatternString folgendermaßen aussehen: "\<div id=\""test\"" class=\""(?<class>(.*))\""\>(?<string>(.*))\<\/div\>"
nun kann habe ich in .Group("class") den KlassenNamen und in .Group("string") den Inhalt im DIV Container.

Das (.*) in den Pattern bedeutet lediglich akzeptiere alle möglichen Zeichen, keine oder mehrere. Dazu guckt man am besten in die MSDN Referenz , dort stehen alles, was man zur Erzeugung der Pattern benötigt.
Bei der IP könnte der PatternString z.B. auch folgendermaßen aussehen, da eine IP nur aus Zahlen und Punkten besteht
"\<div id=\""myip\""\>(?<string>([0-9.]*))\<\/div\>", heißt also es dürfen die Zahlen 0-9 enthalten sein und Punkte.

Edit: Hier ist noch ein Beispielprojekt
Download (71kb)

Edit:
Hier noch eine super Seite, wo man sich Pattern OPTISCH zusammen stückeln kann http://www.txt2re.com/


Edit (03.05.2010):
Da ich nun immer häufiger gelesen habe, das einige etwas auslesen möchten, wo die Pattern öfters zutreffen, habe ich mal ein wenig experimentiert und nun kann ich mit einem kleinen einfachen Code in meinem Beispiel z.B. alle URLs der IMG-Tags von einem HTML Dokument auslesen.

HTML

1
2
3
4
5
6
7
8
9
10
11
12
13
<html>
<head>
<title>Hallo</title>
</head>

<body>
<img src="test.png" width="100" />
<img border="0" src="bild.png" />
<img src="http://www.server.de/bild.png" width="100" />
<img src="vb.png" width="100" />
<img src="foo.png" width="100" />
</body>
</html>


Visual Basic Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
Imports System
Imports System.Text.RegularExpressions

Public Class Form1
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim rx As New Regex("<img(.*)src=""(?<url>([a-zA-Z0-9.:-_/]+))""(.*)>", RegexOptions.Compiled Or RegexOptions.IgnoreCase)

        Dim rxMatches As MatchCollection = rx.Matches(TextBox1.Text)
        For Each oMatch As Match In rxMatches
            ListBox1.Items.Add(oMatch.Groups("url").ToString())
        Next
    End Sub
End Class


Wie man sieht total simpel. Sollten in der URL noch andere Zeichen vorkommen so müssten sie im Pattern nachgetragen werden, man sollte hier jedoch nicht (.*) eingeben, da ansonsten alles zwischen dem ersten und letzten Anführungszeichen ausgegeben wird, also bei dem Text

HTML

1
<img src="vb.png" width="100" />


würde in der Listbox

Quellcode

1
vb.png" width="100


angezeigt werden.

Edit: Hier noch ein gutes Tutorial http://www.codeproject.com/KB/dotnet/regextutorial.aspx
KEINE VB-FRAGEN ÜBER PN STELLEN!

Wenn du einem Hungernden einen Fisch schenkst, wird er morgen wieder hungrig sein, bringst du ihm das Fischen bei, wird er nie wieder hungrig sein.

Alle Copy & Paste Geber und Forderer, nehmt euch dies zu Herzen!

Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von »Dodo« (9. Mai 2011, 14:27)


sleepdaddy

Registrierter Benutzer

Beiträge: 55

Dabei seit: 20. November 2008

  • Private Nachricht senden

2

Dienstag, 7. Juli 2009, 22:06

Habe mal eine kleine Frage hierzu:
Der Quelltext lautet:

Quellcode

1
<div id="myip"> das was ich haben will </div>


Daraus wird dann:

Visual Basic Quellcode

1
Dim ipRegEx As New Regex("\<div id=\""myip\""\>(?<string>(.*))\<\/div\>")

Ich frage mich wo diese ganzen / und \ und " herkommen.
Also <div id="myip"> steht vorne und </div> steht hinten und in der Mitte der String eben.
Aber wieso wird aus

Quellcode

1
<div id="myip">
das:

Quellcode

1
 \<div id=\""myip\""\> ??


Warum kann ich nicht sagen:

Visual Basic Quellcode

1
Dim ipRegEx As New Regex("<div id="myip">(?<string>(.*))</div>")

Cha0s FR3AK

Registrierter Benutzer

  • »Cha0s FR3AK« ist männlich

Beiträge: 58

Dabei seit: 11. März 2009

Wohnort: C:\

Frühere Benutzernamen: Cha0s FR3AK; FR3AK.NET

  • Private Nachricht senden

3

Mittwoch, 8. Juli 2009, 00:53

sleepdaddy aehm wenn du das nur mit einem " machst denkt sich die regex abfrage es endet damit ... kA ob ich mich richtig ausdruecke ... jedoch weißt das fehler auf so wie du es amchen willst (im debug)

Dodo

Super Moderator

  • »Dodo« ist der Autor dieses Themas

Beiträge: 4 961

Dabei seit: 5. Oktober 2008

Wohnort: Berlin

Hilfreich-Bewertungen: 586

  • Private Nachricht senden

4

Mittwoch, 8. Juli 2009, 09:19

Weil zum einen " zu dem gesamten String gehört, wenn du aber innerhalb dieses String wieder Anführungszeichen verwenden willst geht das ja nicht einfach so, weil wie schon gesagt, damit würde VB denken der String ist dort zu ende

Bsp.: FALSCH

Visual Basic Quellcode

1
MsgBox("hier ein zeichen " und text geht weiter")
-> Wird VB mäckern

Bsp.: Richtig

Visual Basic Quellcode

1
MsgBox("hier ein zeichen "" und text geht weiter")
-> Messagebox mit hier ein zeichen " und der text geht weiter

Zu den \ die sind nötig um die spnderzeichen zu Escapen. Da diese Zeichen bestimmte bedeutungen in RegEx haben, muss der ja wissen, hierbei handelt es sich um den String und nich um eine Funktion die ich jetzt nutzen soll.

Lese dazu http://de.wikipedia.org/wiki/Maskierungszeichen
KEINE VB-FRAGEN ÜBER PN STELLEN!

Wenn du einem Hungernden einen Fisch schenkst, wird er morgen wieder hungrig sein, bringst du ihm das Fischen bei, wird er nie wieder hungrig sein.

Alle Copy & Paste Geber und Forderer, nehmt euch dies zu Herzen!

5

Donnerstag, 9. Juli 2009, 21:45

Ich krieg es einfach nicht hin :(
Ich möchte aus einem Quelltext das auslesen:

Quellcode

1
.............      <div id="onAir" style="width:420px;overflow:hidden;"><strong><a href="/member/2281" target="_top"><span style="color:#ffdd82">deforceDRX</span></a><span style="color:#dfb649"> mit "Afterwork Dance" (HandsUp)</span></strong></div>.............

Und an einer anderen Stelle:

Quellcode

1
2
3
.................... 

<div style="width:345px;float:left; margin-top:11px; overflow:hidden"> Brisby & Jingles feat. Miloud - Who'll Stop The Rain </div> <div style="width:40px;float:left; margin-top:11px; overflow:hidden"><a href="/tracklist.php"><span style="color:#DFB649"><strong>Tracks</strong></span></a></div> </div>.....................

HP ist www.Technobase.fm..
Ich habe wirklich viel probiert aber es will nichts klappen....
Diese beiden dinge will ich dann halt in einem Label wiedergeben.

MaDetho

Registrierter Benutzer

Beiträge: 9

Dabei seit: 1. August 2007

  • Private Nachricht senden

6

Sonntag, 12. Juli 2009, 15:58

moin :),

hab ein problem mit der RegEx "structur".. ich möcht gern

Quellcode

1
<div class="blub" id="blub" style="display: block;">string</div>


den string auslesen komme aber nicht klar mit den ganzen zeichen vom RegEx (/ \ "" (?string usw.. )

könnt mir da jemand helfen? :thumbsup:

edit : wäre es so richtig ?

Visual Basic Quellcode

1
"\<div class=\""blub\"" id=\""blub\"" style=\""display\: block\;\""\>(?<string>(.*))\<\/div\>"

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »MaDetho« (12. Juli 2009, 16:07)


Alex2000

unregistriert

7

Sonntag, 12. Juli 2009, 19:00

@Dodo: das ist schön, aber was macht wenn ich von x bilibiegen Browser eine Seite den Quelltext auslesen will. Dein Beispiel basiert sich auf Browser Element und NET Framework Classen. Mit Hilfe von WIN API paar Zeilen in Code lässt sich von x bilibiegen Browser den Seiten Quelltext auslesen ! :thumbup:

EDIT: Man kann deine Code erweitern in dem man die URL Adresse eines Browsers ausliest !

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Alex2000« (12. Juli 2009, 19:06)


  • »haiyyu« ist männlich

Beiträge: 2 476

Dabei seit: 16. November 2008

Wohnort: Österreich

Hilfreich-Bewertungen: 354

  • Private Nachricht senden

8

Sonntag, 12. Juli 2009, 19:29

Hey Alex2000,
du hast das ein wenig falsch verstanden.
Wenn jemand den Quelltext von einer Seite auf seiner Festplatte gespeichert hat,
und z.B. das src-Attribut eines img-Elements auslesen will, kann er diesen Code benutzen.

MfG,
-haiyyu
Bitte keine Fragen bezüglich im Forum behandleten Themen per PN! Auch Bitten zur Beantwortung eines Themas per privater Nachricht wird nicht nachgekommen.

Alex2000

unregistriert

9

Sonntag, 12. Juli 2009, 19:33

@haiyyu: verstanden habe ich schon richtig, das schränkt sich auf NET Framework Classen ein, ich will aber system weit unabhängig von genutzten Browser !

  • »haiyyu« ist männlich

Beiträge: 2 476

Dabei seit: 16. November 2008

Wohnort: Österreich

Hilfreich-Bewertungen: 354

  • Private Nachricht senden

10

Sonntag, 12. Juli 2009, 19:55

Hey,
nein, hast du nicht ^^
Also, du kannst bei jedem (gängigen) Browser den Quelltext einer Seite speichern.
Nun kannst du z.B. Attributen mit diesem Code auslesen.
Das hat nichts mit dem Browser zu tun ;)

MfG,
-haiyyu
Bitte keine Fragen bezüglich im Forum behandleten Themen per PN! Auch Bitten zur Beantwortung eines Themas per privater Nachricht wird nicht nachgekommen.

Alex2000

unregistriert

11

Sonntag, 12. Juli 2009, 19:58

Zitat

Also, du kannst bei jedem (gängigen) Browser den Quelltext einer Seite speichern.
Ok gut maestro dann zeige mal wie das funz, aber system weit ... :D :D :D

  • »haiyyu« ist männlich

Beiträge: 2 476

Dabei seit: 16. November 2008

Wohnort: Österreich

Hilfreich-Bewertungen: 354

  • Private Nachricht senden

12

Sonntag, 12. Juli 2009, 20:16

Hey,

Visual Basic Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
Imports System.Net
Imports System.IO
Imports System.Text.RegularExpressions
Public Class Form1
	Dim peoples() As String

	Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    	Dim httpRequest As HttpWebRequest = HttpWebRequest.Create("http://dnp.zir-con.de/_test/vb-test.php")
    	Dim httpResponse As HttpWebResponse = httpRequest.GetResponse()
    	Dim reader As StreamReader = New StreamReader(httpResponse.GetResponseStream)
    	Dim httpContent As String = reader.ReadToEnd

    	txtSourcecode.Text = httpContent

    	Dim ipRegEx As New Regex("\<div id=\""myip\""\>(?<string>(.*))\<\/div\>")
    	Dim myIP As String = ipRegEx.Match(httpContent).Groups("string").ToString()

    	lblIP.Text = "Deine IP: " & myIP

    	Dim peopleRegEx As New Regex("\<div id=\""sqlcollection\""\>(?<string>(.*))\<\/div\>")
    	Dim sqlcollection As String = peopleRegEx.Match(httpContent).Groups("string").ToString()
    	peoples = sqlcollection.Split(",")

    	For Each sqlLine In peoples
        	Dim sqlCells() As String = sqlLine.Split(";")

        	lstPeoples.Items.Add(sqlCells(0))
    	Next

	End Sub

	Private Sub lstPeoples_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles lstPeoples.SelectedIndexChanged
    	Dim sqlCells() As String = peoples(lstPeoples.SelectedIndex).Split(";")
    	lblPeopleInfo.Text = "Wohnort: " & sqlCells(1) & vbNewLine & "Alter: " & sqlCells(2)
	End Sub
End Class
hat Dodo auch schon gepostet.

MfG,
-haiyyu
Bitte keine Fragen bezüglich im Forum behandleten Themen per PN! Auch Bitten zur Beantwortung eines Themas per privater Nachricht wird nicht nachgekommen.

Alex2000

unregistriert

13

Sonntag, 12. Juli 2009, 20:17

:D :D :D ....ja ist ok...hab den Quelltext nicht richtig angeschaut...ich hab mit hilfe WIN API gelöst, funz genau so gut... !

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Alex2000« (13. Juli 2009, 05:23)


sleepdaddy

Registrierter Benutzer

Beiträge: 55

Dabei seit: 20. November 2008

  • Private Nachricht senden

14

Samstag, 25. Juli 2009, 04:42

Also ich bekomme es immernoch nicht hin.

Habe diesen HTML Code:

Quellcode

1
userid=123">XXXX</a><img src="

Dieses XXXX in der Mitte möchte ich gerne als String haben.
Aber wie muss ich diese Klammern setzen?

Ich bekomme immer den Fehler "Falsche Escape-Zeichensetzung"

Könnte mir netterweise jemand den Code geben? :love:

gs93

Super Moderator

  • »gs93« ist männlich

Beiträge: 1 375

Dabei seit: 27. März 2009

Hilfreich-Bewertungen: 16

  • Private Nachricht senden

15

Samstag, 25. Juli 2009, 05:20

Visual Basic Quellcode

1
Dim ipRegEx As New Regex("userid=123\""\>(?<string>(.*))\<\/a\>\<img src=\""")
Weiß jetzt nicht, ob das so richtig ist.
bla

sleepdaddy

Registrierter Benutzer

Beiträge: 55

Dabei seit: 20. November 2008

  • Private Nachricht senden

16

Sonntag, 26. Juli 2009, 00:21

Visual Basic Quellcode

1
Dim ipRegEx As New Regex("userid=123\""\>(?<string>(.*))\<\/a\>\<img src=\""")
Weiß jetzt nicht, ob das so richtig ist.
Also es kommt schonmal keine Fehlermeldung mehr.
Aber dafür ist der String leer.
Also es steht nix drin.

SAR-71

Programmierer aus Leidenschaft

  • »SAR-71« ist männlich

Beiträge: 429

Dabei seit: 11. März 2009

Wohnort: Hamburg

Hilfreich-Bewertungen: 65

  • Private Nachricht senden

17

Mittwoch, 29. Juli 2009, 02:06

Nabend

Also mal meine Frage(n):

Kann ich den Reader so einstellen das nur eine bestimme Zeile ließt?
Ich hab ein HTML-Dokument das mehrere 100 Zeilen hat, und was dazu kommt
Das was ich haben will ist locker 10-x vorhanden


Quellcode

1
<td align="center" class='header' width="90"><font >636</font></td>


Das 636 möchte haben (Zeile 88), aber leide gibt die gleichen Blocks (Nur mit anderen Werten), wie schon gesagt, mehrmals




Ist das möglich?

noname

Phrasendrescher

  • »noname« ist männlich

Beiträge: 258

Dabei seit: 15. Juli 2007

Wohnort: Soltau

Hilfreich-Bewertungen: 5

  • Private Nachricht senden

18

Mittwoch, 29. Juli 2009, 02:14

Du nimmst einfach ein Pattern was auf jede dieser Zeilen matcht. Am Ende einfach nur auf die Collection (oder Array oder was auch immer bei mehreren Treffern zurückgegeben wird) am Index i zugreifen. Deine bestimmte Zeile muss natürlich immer an der gleichen Stelle in der Collection (...) sein.
Kontra GPL

SAR-71

Programmierer aus Leidenschaft

  • »SAR-71« ist männlich

Beiträge: 429

Dabei seit: 11. März 2009

Wohnort: Hamburg

Hilfreich-Bewertungen: 65

  • Private Nachricht senden

19

Mittwoch, 29. Juli 2009, 03:24

Ich weis jetzt warum es bei nicht klappt

Er kann den Quelltext nicht richtig anzeigen, weil ich ein Proxy an habe :D




Kann man das mit eingeschalteten Proxy lesen? :P

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »SAR-71« (29. Juli 2009, 18:50)


devilofcrash

Registrierter Benutzer

  • »devilofcrash« ist männlich

Beiträge: 105

Dabei seit: 5. Juli 2009

  • Private Nachricht senden

20

Dienstag, 1. September 2009, 00:28

hallo, ich hätt da mal eine frage...

ich habe mir das hier ja mal angeschaut und möcht ja mehr lernen, nun bastelte ich ja schon rum, und hatte das hier gemacht... nix weltbewegendes, is ja schon hier 2 ma gepostet worden

Visual Basic Quellcode

1
2
        Dim RegEx01 As New Regex("\<div id=\""nr\""\>(?<string>(.*))\<\/div\>")
Dim nr As String = RegEx01.Match(httpContent).Groups("string").ToString()


Sooooooo nun meine frage, die div Box ist ja dynamisch, das bedeutet, die ID der div ändert sich der reihe nach mit zahlen, also nr1, nr2 und so weida... wie geb ich das hier an dass er jenachdem wieviel einträge sichtbar sind auch die ID´s dazu schreibt zur divid?

Social Bookmarks