Aus Quelltext String auslesen

  • VB.NET

Es gibt 20 Antworten in diesem Thema. Der letzte Beitrag () ist von J.Herbrich.

    Aus Quelltext String auslesen

    Hey,
    Ich bin neu hier im Forum und ebenfalls ein Anfänger was VB betrifft. :P
    Ich versuche mich gerade daran drei Werte aus einer Webseite auslesen zu lassen. Das auslesen des Quelltextes habe ich hinbekommen nur das Durchsuchen des selbigen auf:

    HTML-Quellcode

    1. "wood":1698,"stone":1940,"iron":41


    bekomme ich nicht hin. Versucht habe ich dies:

    Visual Basic-Quellcode

    1. QuelltextMatches = Regex.Matches(RichTextBox1.Text, "", RegexOptions.IgnoreCase)


    Nun ist mein Problem nur das ich das Suchmuster nicht richtig eingestellt bekomme bzw. nicht genau weis wie ich denn eine solches Muster angehen soll.
    Das Tutorial hierzu auf VB-Paradise habe ich bereits gefunden, konnte jedoch nicht so viel daraus ziehen wie erhofft.
    Nun wollte ich hier fragen ob mir jemand einen Tipp geben könnte wie ich das angehen sollte. :)
    MfG
    Kellojo

    ErfinderDesRades schrieb:

    RegEx Tutorial - Blutige Anfänger und Fortgeschrittene
    Und entwickeln tut man son Pattern am besten mit einem RegexTester. Gibt auch Online-Regextester, google mal, die sind sehr unterschiedlich.

    nafets schrieb:

    Machs so: "wood":(?<wood>\d*?),"stone":(?<stone>\d*?),"iron":(?<iron>\d*?)


    Erst einmal vielen Dank für die zahlreichen Antworten :thumbsup:
    werde das gleich mal ausprobieren


    Rinecamo schrieb:

    Wie sieht der komplette Text aus den du Auslesen willst? Das geht ja stark in die Richtung von JSON.


    Das ganze ist aus einem Browser Game, aus welchem ich die Rohstoffe auslesen möchte um sie mir auf meinem zweiten Monitor anzeigen zu lassen - ist wohl mehr Spielerei als etwas mit Zweck, aber ich wollte das ganze auch eher angehen um eine Vorstellung davon zu bekommen, was denn alles so geht.


    EDIT:
    Habe das ganze jetzt ausprobiert funktioniert super dickes DANKE an euch :D drei
    MfG
    Kellojo

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Kellojo“ ()

    Wen das JSON ist erstelle ein Datenvertrag (Klasse mit DataContract Attribute) und declariee die Datemember da drinnen. Dass geht leichter als ein Regex Pattern zu schreiben um iwas aus nen JSON-String auszulesen.
    Ich werde das wenn ich zuhause bin gleich mal nachlesen - Danke für die Antowrten

    EDIT: ich poste nacher mal den ganzen Quelltext dann kann jeder sich ein Bild davon machen worum es geht

    mfg
    Kellojo

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Kellojo“ ()

    So,
    Ich habe nachgeschaut das ganze ist java script.
    Des weiteren geht es auch ohne Regex, wenn man einen Timer benutzt und sich dann die einzelnen Elemente der Seite auslesen lässt ( ist wesentlich weniger Aufwand - ich empfehle es jedem).
    Zu guter letzt sage ich noch danke an alle die mir geholfen haben und oder es versucht haben. :thumbsup:
    Den Quelltext werde ich nicht posten, da ich glaube dass das nicht mehr nötig ist, wenn doch jemand daran Interesse haben sollte bitte einfach nochmal hierein schreiben, dann werde ich ihn posten. :)
    Nochmals vielen Dank :thumbsup:
    MfG
    Kellojo

    Kellojo schrieb:

    ( ist wesentlich weniger Aufwand - ich empfehle es jedem)

    Ja? Ich nicht. Das ist mehr als unsauber und solche praktiken solltest du dir erst gar nicht angewöhnen.
    Poste bitte mal den kompletten Code, du wirst ggf. staunen wir einfach das ist ;)
    So: Hier der Quellcode ( ist nicht der ganze, da das 1000 Zeilen lang ist ...) der Seite die Stellen die ich brauche habe ich farbig makiert :D

    Spoiler anzeigen

    <!DOCTYPE HTML><html><head> <title>Apache-1-1 (684|795) - Die Stämme - Welt 114</title> <meta http-equiv="content-type" content="text/html; charset=UTF-8" /> <link id="favicon" rel="shortcut icon" href="/favicon.ico" />
    <link rel="stylesheet" type="text/css" href="/merged/game.css?1430297714" />
    <link rel="stylesheet" type="text/css" href="/css/game/overview.css?1430297714" />
    <script type="text/javascript" src="/merged/game.js?1430297714"></script>
    <script type="text/javascript" src="/js/game/VillageOverview.js?1427191506"></script>
    <script type="text/javascript"> //<![CDATA[ var sds = false; var image_base = "http://dsde.innogamescdn.com/8.33.4/25814/graphic/"; var mobile = false; var mobile_on_normal = false; var mobiledevice = false; var premium = false; var server_utc_diff = 7200;
    var game_data = {"player":{"name":"Kellojo","ally":"14401","sitter":"0","sleep_start":"0","sitter_type":"normal","sleep_end":"0","sleep_last":"0","interstitial":"0","email_valid":"1","villages":"1","incomings":"0","supports":0,"knight_location":"143869","knight_unit":"915897272","rank":13709,"points":"513","date_started":"1429816481","is_guest":"0","birthdate":"0000-00-00","id":"9735706","quest_progress":"0","premium":false,"account_manager":false,"farm_manager":true,"points_formatted":"513","rank_formatted":"13<span class=\"grey\">.<\/span>709","pp":"200","new_ally_application":"0","new_ally_invite":"0","new_buddy_request":"0","new_forum_post":"0","new_igm":"0","new_items":"0","new_report":"0","fire_pixel":"0","new_quest":"1"},"village":{"id":143869,"name":"Apache-1-1","wood_prod":0.10781432092338,"stone_prod":0.10781432092338,"iron_prod":0.10781432092338,"storage_max":7893,"pop_max":854,"wood_float":92.808392828043,"stone_float":6031.808392828,"iron_float":5104.808392828,"wood":93,"stone":6032,"iron":5105,"pop":806,"x":684,"y":795,"trader_away":0,"bonus_id":null,"bonus":{"wood":1.04,"stone":1.04,"iron":1.04},"buildings":{"village":"143869","main":"10","farm":"9","storage":"11","place":"1","barracks":"5","church":"0","church_f":"0","smith":"5","wood":"15","stone":"15","iron":"15","market":"2","stable":"3","wall":"8","garage":"0","hide":"2","snob":"0","statue":"1","watchtower":"0"},"player_id":"9735706","res":[93,0.10781432092338,6032,0.10781432092338,5105,0.10781432092338,7893,806,854],"coord":"684|795","is_farm_upgradable":true},"nav":{"parent":1},"link_base":"\/game.php?village=143869&amp;screen=","link_base_pure":"\/game.php?village=143869&screen=","csrf":"b8ed6580","world":"de114","market":"de","RTL":false,"version":"25814 8.33.4","majorVersion":"8.33.4","screen":"overview","mode":null,"device":"desktop","pregame":false}; var csrf_token = 'b8ed6580'; UI.AutoComplete.url = '/game.php?village=143869&ajaxaction=autocomplete&h=b8ed6580&screen=api'; ScriptAPI.url = '/game.php?village=143869&ajax=save_script&screen=api'; ScriptAPI.version = parseFloat(game_data.majorVersion);



    Momentan habe ich es so gelöst :
    - Mit einem Timer auf 5 Sekunden und diesem code, welcher direkt auf die einzelnen Elemente der Webseite zugreift und diese ausließt.

    Spoiler anzeigen

    VB.NET-Quellcode

    1. 'Get the resources and display them
    2. Dim ResourcesAll As HtmlElementCollection = Webbrowser.Document.All
    3. For Each HtmlElement As HtmlElement In ResourcesAll
    4. If HtmlElement.GetAttribute("id") = "wood" Then
    5. wood = HtmlElement.GetAttribute("innerText")
    6. HolzToolStripLabel.Text = "Holz: " + wood
    7. End If
    8. Next
    9. ResourcesAll = Webbrowser.Document.All
    10. For Each HtmlElement As HtmlElement In ResourcesAll
    11. If HtmlElement.GetAttribute("id") = "stone" Then
    12. stone = HtmlElement.GetAttribute("innerText")
    13. LehmToolStripLabel.Text = "Lehm: " + stone
    14. End If
    15. Next
    16. ResourcesAll = Webbrowser.Document.All
    17. For Each HtmlElement As HtmlElement In ResourcesAll
    18. If HtmlElement.GetAttribute("id") = "iron" Then
    19. iron = HtmlElement.GetAttribute("innerText")
    20. EisenToolStripLabel.Text = "Eisen: " + iron
    21. End If
    22. Next




    EDIT: Man bräuchte also nur eine Schleife, in welcher dann der Code hineinkommt... habe mich damit schon versucht und werde es wohl heute morgen weiterhin versuchen ^

    MfG
    Kellojo

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Kellojo“ ()

    Da das ganze Json ist will ich dir die möglichkeit noch aufzeigen wie man das ganze damit lösen könnte:

    Als erstes Kopierst du dir den kompletten Json Teil des Textes:
    Spoiler anzeigen

    XML-Quellcode

    1. {
    2. "player": {
    3. "name": "Kellojo",
    4. "ally": "14401",
    5. "sitter": "0",
    6. "sleep_start": "0",
    7. "sitter_type": "normal",
    8. "sleep_end": "0",
    9. "sleep_last": "0",
    10. "interstitial": "0",
    11. "email_valid": "1",
    12. "villages": "1",
    13. "incomings": "0",
    14. "supports": 0,
    15. "knight_location": "143869",
    16. "knight_unit": "915897272",
    17. "rank": 13709,
    18. "points": "513",
    19. "date_started": "1429816481",
    20. "is_guest": "0",
    21. "birthdate": "0000-00-00",
    22. "id": "9735706",
    23. "quest_progress": "0",
    24. "premium": false,
    25. "account_manager": false,
    26. "farm_manager": true,
    27. "points_formatted": "513",
    28. "rank_formatted": "13<span class=\"grey\">.</span>709",
    29. "pp": "200",
    30. "new_ally_application": "0",
    31. "new_ally_invite": "0",
    32. "new_buddy_request": "0",
    33. "new_forum_post": "0",
    34. "new_igm": "0",
    35. "new_items": "0",
    36. "new_report": "0",
    37. "fire_pixel": "0",
    38. "new_quest": "1"
    39. },
    40. "village": {
    41. "id": 143869,
    42. "name": "Apache-1-1",
    43. "wood_prod": 0.10781432092338,
    44. "stone_prod": 0.10781432092338,
    45. "iron_prod": 0.10781432092338,
    46. "storage_max": 7893,
    47. "pop_max": 854,
    48. "wood_float": 92.808392828043,
    49. "stone_float": 6031.808392828,
    50. "iron_float": 5104.808392828,
    51. "wood": 93,
    52. "stone": 6032,
    53. "iron": 5105,
    54. "pop": 806,
    55. "x": 684,
    56. "y": 795,
    57. "trader_away": 0,
    58. "bonus_id": null,
    59. "bonus": {
    60. "wood": 1.04,
    61. "stone": 1.04,
    62. "iron": 1.04
    63. },
    64. "buildings": {
    65. "village": "143869",
    66. "main": "10",
    67. "farm": "9",
    68. "storage": "11",
    69. "place": "1",
    70. "barracks": "5",
    71. "church": "0",
    72. "church_f": "0",
    73. "smith": "5",
    74. "wood": "15",
    75. "stone": "15",
    76. "iron": "15",
    77. "market": "2",
    78. "stable": "3",
    79. "wall": "8",
    80. "garage": "0",
    81. "hide": "2",
    82. "snob": "0",
    83. "statue": "1",
    84. "watchtower": "0"
    85. },
    86. "player_id": "9735706",
    87. "res": [
    88. 93,
    89. 0.10781432092338,
    90. 6032,
    91. 0.10781432092338,
    92. 5105,
    93. 0.10781432092338,
    94. 7893,
    95. 806,
    96. 854
    97. ],
    98. "coord": "684|795",
    99. "is_farm_upgradable": true
    100. },
    101. "nav": {
    102. "parent": 1
    103. },
    104. "link_base": "/game.php?village=143869&amp;screen=",
    105. "link_base_pure": "/game.php?village=143869&screen=",
    106. "csrf": "b8ed6580",
    107. "world": "de114",
    108. "market": "de",
    109. "RTL": false,
    110. "version": "25814 8.33.4",
    111. "majorVersion": "8.33.4",
    112. "screen": "overview",
    113. "mode": null,
    114. "device": "desktop",
    115. "pregame": false
    116. }

    Dann kannst du auf http://json2csharp.com/ gehen und dort den Text einfügen, die Seite generiert die eine Klasse welche du dann Deserialisieren kannst:
    Spoiler anzeigen

    C#-Quellcode

    1. public class Player
    2. {
    3. public string name { get; set; }
    4. public string ally { get; set; }
    5. public string sitter { get; set; }
    6. public string sleep_start { get; set; }
    7. public string sitter_type { get; set; }
    8. public string sleep_end { get; set; }
    9. public string sleep_last { get; set; }
    10. public string interstitial { get; set; }
    11. public string email_valid { get; set; }
    12. public string villages { get; set; }
    13. public string incomings { get; set; }
    14. public int supports { get; set; }
    15. public string knight_location { get; set; }
    16. public string knight_unit { get; set; }
    17. public int rank { get; set; }
    18. public string points { get; set; }
    19. public string date_started { get; set; }
    20. public string is_guest { get; set; }
    21. public string birthdate { get; set; }
    22. public string id { get; set; }
    23. public string quest_progress { get; set; }
    24. public bool premium { get; set; }
    25. public bool account_manager { get; set; }
    26. public bool farm_manager { get; set; }
    27. public string points_formatted { get; set; }
    28. public string rank_formatted { get; set; }
    29. public string pp { get; set; }
    30. public string new_ally_application { get; set; }
    31. public string new_ally_invite { get; set; }
    32. public string new_buddy_request { get; set; }
    33. public string new_forum_post { get; set; }
    34. public string new_igm { get; set; }
    35. public string new_items { get; set; }
    36. public string new_report { get; set; }
    37. public string fire_pixel { get; set; }
    38. public string new_quest { get; set; }
    39. }
    40. public class Bonus
    41. {
    42. public double wood { get; set; }
    43. public double stone { get; set; }
    44. public double iron { get; set; }
    45. }
    46. public class Buildings
    47. {
    48. public string village { get; set; }
    49. public string main { get; set; }
    50. public string farm { get; set; }
    51. public string storage { get; set; }
    52. public string place { get; set; }
    53. public string barracks { get; set; }
    54. public string church { get; set; }
    55. public string church_f { get; set; }
    56. public string smith { get; set; }
    57. public string wood { get; set; }
    58. public string stone { get; set; }
    59. public string iron { get; set; }
    60. public string market { get; set; }
    61. public string stable { get; set; }
    62. public string wall { get; set; }
    63. public string garage { get; set; }
    64. public string hide { get; set; }
    65. public string snob { get; set; }
    66. public string statue { get; set; }
    67. public string watchtower { get; set; }
    68. }
    69. public class Village
    70. {
    71. public int id { get; set; }
    72. public string name { get; set; }
    73. public double wood_prod { get; set; }
    74. public double stone_prod { get; set; }
    75. public double iron_prod { get; set; }
    76. public int storage_max { get; set; }
    77. public int pop_max { get; set; }
    78. public double wood_float { get; set; }
    79. public double stone_float { get; set; }
    80. public double iron_float { get; set; }
    81. public int wood { get; set; }
    82. public int stone { get; set; }
    83. public int iron { get; set; }
    84. public int pop { get; set; }
    85. public int x { get; set; }
    86. public int y { get; set; }
    87. public int trader_away { get; set; }
    88. public object bonus_id { get; set; }
    89. public Bonus bonus { get; set; }
    90. public Buildings buildings { get; set; }
    91. public string player_id { get; set; }
    92. public List<double> res { get; set; }
    93. public string coord { get; set; }
    94. public bool is_farm_upgradable { get; set; }
    95. }
    96. public class Nav
    97. {
    98. public int parent { get; set; }
    99. }
    100. public class Info
    101. {
    102. public Player player { get; set; }
    103. public Village village { get; set; }
    104. public Nav nav { get; set; }
    105. public string link_base { get; set; }
    106. public string link_base_pure { get; set; }
    107. public string csrf { get; set; }
    108. public string world { get; set; }
    109. public string market { get; set; }
    110. public bool RTL { get; set; }
    111. public string version { get; set; }
    112. public string majorVersion { get; set; }
    113. public string screen { get; set; }
    114. public object mode { get; set; }
    115. public string device { get; set; }
    116. public bool pregame { get; set; }
    117. }


    Deserialisieren tust du so:

    C#-Quellcode

    1. var SpielInfo = JsonConvert.DeserializeObject<Info>(json);


    Und jetzt kannst du auf alle Infos (Welche das sind kannst der Klasse die du Deserialisiert entnehmen) zugreifen z.B.:

    C#-Quellcode

    1. EisenToolStripLabel.Text = SpielInfo.village.iron.ToString()


    Achja: Warum die Ausrede "Das ist aber C#" nicht gilt

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Dokta“ ()

    Hey Dokta,
    Danke für deine Hilfestellung :thumbsup:
    Das ganze hört sich sehr interessant und nützlich an und ich bin gerade dabei das zu testen, nur habe ich das ein oder andere Problem ?(
    Ich habe das nicht ganz verstanden wie das umzusetzen ist, es wäre nett wenn du da z.B. ein kleines beispiel posten könntest, da ich auch aus Erklärungen anderer nicht schlau werde...
    Es geht speziell um das Deserialisieren, ich bin mir nicht sicher wo da was hineingehört bzw. welche variablen du für was genutzt hast...

    PS: Tut mir leid, wenn das eine blöde Frage ist - kenne mich noch nicht sonderlich aus da ich vor wenigen tagen angefangen habe mit VB ;)
    MfG
    Kellojo

    C#-Quellcode

    1. private void button1_Click(object sender, EventArgs e)
    2. {
    3. Info spielInfo; //Das ist die von json2csharp.com erstellte Klasse zum Deserialisieren.
    4. string json = "JSON";// Hier musst du nun den Jsontext der auf der Seite in 'var game_data' steht zuweisen
    5. spielInfo = JsonConvert.DeserializeObject<Info>(json); // Hier wird sozusagen die Instanz "spielInfo" der zu deserialisierenden Klasse mit Informationen befüllt.
    6. lblIron.Text = spielInfo.village.iron.ToString();
    7. }


    Du musst nur vorher Json.net installieren -> nuget.org/packages/newtonsoft.json/

    Anbei noch ein kleines Beispielprojekt um das ganze mal gesehen zu haben.
    In dem Projekt werden die Daten aus einer lokalen json-Datei geladen, nicht von der Seite direkt, das ist dann deine Arbeit :)

    Kellojo schrieb:

    da ich vor wenigen tagen angefangen habe mit VB


    Dann empfehle ich dir direkt mal diesen Thread Visual Studio - Empfohlene Einstellungen <- Ist sozusagen eine Pflichtlektüre!
    Dateien
    • Demo.zip

      (3,41 MB, 192 mal heruntergeladen, zuletzt: )

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Dokta“ ()

    Warum benutzt ihr eigentlich eine extra libary wen man mit System.Runtime.Serialisation.JSON sowas auch mit Bordmitteln des netframeworks desierialisieren kann, jede zusätzliche eingebundene lib bläht doch nur dass Programm umntötig auf oder habe ich da was falsch verstahnden. ? ^^

    LG, J.Herbrich