JavaScript Seite auslesen

Sack

Sigma Hydrae
ID: 232829
L
20 April 2006
5.162
320
Hey,
ich hab eine html datei die sich immer wieder ändert, und die ungefähr so aufgebaut ist:
HTML:
<h3>Überschrift</h3>
Region: <b>egal</b> Battle: <b><a href="link">Link</a></b><br>
      Hospital @ <b>Zeit</b><br>
      Hospital @ <b>andere Zeit</b><br>
      weitere angaben...<br>
<br>
Region: <b>egal</b> Battle: <b><a href="link">Link</a></b><br>
      Hospital @ <b>Zeit</b><br>
      Hospital @ <b>andere Zeit</b><br>
      weitere angaben...<br>
<br>
Region: <b>egal</b> Battle: <b><a href="link">Link</a></b><br>
      Hospital @ <b>Zeit</b><br>
      Hospital @ <b>andere Zeit</b><br>
      weitere angaben...<br>
<br>
Region: <b>egal</b> Battle: <b><a href="link">Link</a></b><br>
      Hospital @ <b>Zeit</b><br>
      Hospital @ <b>andere Zeit</b><br>
      weitere angaben...<br>
<br>
Region: <b>egal</b> Battle: <b><a href="link">Link</a></b><br>
      Hospital @ <b>Zeit</b><br>
      Hospital @ <b>andere Zeit</b><br>
      weitere angaben...<br>
<br>
Region: <b>egal</b> Battle: <b><a href="link">Link</a></b><br>
      Hospital @ <b>Zeit</b><br>
      Hospital @ <b>andere Zeit</b><br>
      weitere angaben...<br>
<br>
Region: <b>egal</b> Battle: <b><a href="link">Link</a></b><br>
      Hospital @ <b>Zeit</b><br>
      Hospital @ <b>andere Zeit</b><br>
      weitere angaben...<br>
<br>

Ich würd jetzt gern jeweils
HTML:
Region: <b>egal</b> Battle: <b><a href="link">Link</a></b>
Hospital @ <b>Zeit</b>
auslesen. Das muss ich aber irgendwie mit JS machen, da Greasemonkey nichts anderes unterstützt. Hat jemand eine ahnung wie ich das machen kann?
Das eigentliche Greasemonkey script hab ich schon fertig.
Und da ich keine große JS Leuchte bin wollt ich mal fragen, ob mir nicht hier jemand kurz helfen kann?

Wär echt super nett.
Danke,
Sack
 
Du könntest es mit einem Regulären Ausdruck machen. Je nach dem was sich ändert musst du das dann mit im Ausdruck einbauen oder du musst ihn ab und zu ändern ... ;)
 
Ohne mehr wissen zu haben, als ich mir schnell bei selfhtml darüber angelesen habe glaube ich, dass du meine frage leider falsch verstanden hast.
Ich hab die seite test.de und möchte die oben genannten teile auf test2.de ausgeben, also auf unabhängigen seiten.

Mit regulären ausrücken kann ich doch nur auslesen, was auf der gleichen Seite steht, oder?
 
Hi ja da hatte ich wohl was falsch verstanden.
Mit dem Regulären Ausdruck filterst du die Sachen raus die du brauchst. Auslesen geht damit nicht.
Wie man nur in Javascript eine 2. Seite auslesen kann fällt mir direkt jetzt nichts ein. Man könnte halt mit AJAX eine PHP Datei aufrufen aber wenn du ein Greasemonkey Script benutzt fällt das wohl weg oder?
 
Danke erstmal buddha für die ganze Hilfe.

Jo, das fällt weg. Ich hab aber gerade eine Greasemonkey funktion entdeckt, mit der man eine Seite auslesen kann (GM_xmlhttpRequest).
Jetzt muss ich nurnoch rausfinden wie ich das mit den regulären begriffen machen kann.
Mit match() kann ich das irgendwie auslesen, soviel hab ich verstanden...
Aber wie?! Teile ändern sich ja, dann kann ich ja nicht folgendes machen:
Variable.match(Region)
oder so machen. Ich check irgendwie nicht wie das funktionieren soll.
Habs mir schon bei selfhtml durchgelesen, aber das hilft irgendwie nicht.

Die Region, der Link, und die Zeit sind ja genau die Dinge, die sich ändern, aber deswegen auch die einzigen die ich auslesen will...

Kann mir das vielleicht irgendwer erklären?

edit: danke auch an x3ntar und ice-breaker, auch wenn mir eure Beiträge nicht geholfen haben^^
 
Greasemonkey hat imo keine Beschränkungen, da ja vom Nutzer selber gewünscht.

Du nimmst innerHTML/Ajax-Request, macht-ed das dann mit nem regulären Ausdruck (den du dir programmieren/ausdenken musst), und bekommst so dann ein Array aus (wahrscheinlich) Region, Zeit und Link.
 
Danke, bin schon bei innerHTML und so angekommen, mein Quelltext sieht im moment so aus:
HTML:
// ==UserScript==
// @name           Hospitals
// @namespace      kcaS | Sack
// @description    nix
// @include        *domain*
// ==/UserScript==


GM_xmlhttpRequest({
    method: 'GET',
    url: 'domain',

    onload: function(responseDetails) {
Zeit.match(
    }
});


var LinkDiv = document.createElement('div');
LinkDiv.id = 'LinkDiv';
LinkDiv.innerHTML += 'Test';
document.getElementById('shouts_component').appendChild(LinkDiv);

bei 'Test' muss ich später das was ich mit HTML ausgeben will einfügen, das ist klar, aber ich scheiter halt noch bei dem Zeit.match() ding, weil ich nicht verstehe wie das mit dem regulären Ausdruck machen soll?!
wenn da (unter anderem) sowas steht:
Region: Regionsname Battle: Land1 vs Land2
Hospital @ 05.05. 09:00 CET

Und ich möchte jetzt die Region auslesen, dann kann ich ja schlecht so machen:
region.Match(/Regionsname/)
o.ä. da sich der Regionsname ja immer änder. Der kann auch mal aus mehreren Wörtern bestehen und so...
 
Imo müsste es sowas sein wie:

responseDetails.responseText.match(/(.*?): <b>.*?</b>/);

Regex ist nicht vollständig. Nur ne Notiz.

Es würde sehr helfen wenn du uns irgendwie kennzeichnest, was da die Variablen im Quellcode sind und was fix ist.
 
Mit (.*) markierst du im Regulären Ausdruck etwas das du in deinem Array haben willst.
Für den String "Region: Regionsname Battle: Land1 vs Land2 Hospital @ 05.05. 09:00 CET" bräuchtest du also diesen Regulären Ausdruck:
Code:
/Region: (.*) Battle: (.*) Hospital @ (.*)/
Und du hättest dann in einem Array die 3 Werte die du haben willst in der Reihenfolge wie die Platzhalter sitzen. Also den Array Index 1 hat dann die Region (Regionsname mit dem Beispielstring von oben), Index 2 das Battle und Index 3 hätte das Datum des Hospital
Das musst du jetzt natürlich noch ein wenig anpassen rumprobieren hilft.
Ich benutz immer gerne den hier zum testen: https://rubular.com/
Auf der Seite siehst du unten auch eine Mini Referenz mit den wichtigsten Sachen ... ;)
 
Erstmal wieder danke für die Hilfe^^

Imo müsste es sowas sein wie:

responseDetails.responseText.match(/(.*?): <b>.*?</b>/);
Danke.
Für den String "Region: Regionsname Battle: Land1 vs Land2 Hospital @ 05.05. 09:00 CET" bräuchtest du also diesen Regulären Ausdruck:
Code:
/Region: (.*) Battle: (.*) Hospital @ (.*)/
Ich benutz immer gerne den hier zum testen: https://rubular.com/
Auf der Seite siehst du unten auch eine Mini Referenz mit den wichtigsten Sachen ... ;)

Danke für den Tipp, scheint ne nützliche Seite zu sein :)
ABER:
ich hab als regular expression
Code:
Region: (.*) Battle: (.*) Hospital @ (.*)
genommen und
HTML:
<h3>Überschrift</h3>
Region: <b>egal</b> Battle: <b><a href="link">Link</a></b><br>
      Hospital @ <b>Zeit</b><br>
als test string.
Ich bekomme die Meldung "no matches"?
Hab schon mit Hilfe der Kurzreferenz nach einem anderen passenden regulären Ausdruck gesucht, aber nichts passendes gefunden...
 
Das liegt daran das da HTML Code mit drin ist
Ein Beispiel wie du es machen könntest:
Code:
/Region: <b>(.*)<\/b> Battle: <b>(.*)<\/b>.*Hospital @ <b>(.*)<\/b>/

Dann geht dein Beispiel auch:

<h3>Überschrift</h3> Region: <b>egal</b> Battle: <b><a href="link">Link</a></b><br>       Hospital @ <b>Zeit</b><br>

Und im Array hast du dann:
1. egal
2. <a href="link">Link</a>
3. Zeit
 
Code:
var text = document.getElementById('in').innerHTML;
var output = '';
var exp = new RegExp(/(Region:\s+<b>.*?<\/b>)\s+(Battle:\s+<b>.*?<\/b>)<br>\s+.*?(Hospital\s+@\s+<b>.*?<\/b>)/gi);

while(helper = exp.exec(text)) {
    output += helper[1]+' '+helper[2]+' '+helper[3]+'<br>';
}
alert(output);
 
Zuletzt bearbeitet:
Ich hab jetzt folgenden Code:
Code:
// ==UserScript==
// @name           Hospitals
// @namespace      kcaS | Sack
// @description    Fügt eine Liste der BW mit Hospitals in folgenden kämpfen ein.
// @include        *link*
// ==/UserScript==


GM_xmlhttpRequest({
    method: 'GET',
    url: 'Link',

    onload: function(responseDetails) {
	responseDetails.responseText.match(/Region: <b>(.*)<\/b> Battle: <b>(.*)<\/b>.*Hospital @ <b>(.*)<\/b>/);
    }
});


var LinkDiv = document.createElement('div');
LinkDiv.id = 'LinkDiv';
LinkDiv.innerHTML += responseDetails;
document.getElementById('shouts_component').appendChild(LinkDiv);

Funktioniert natürlich nicht, damit hab ich gerechnet^^
Aber ich weiß auch nicht, wie ich es richtig machen muss.

Danke^^
Code:
var text = document.getElementById('in').innerHTML;
var output = '';
var exp = new RegExp(/(Region:\s+<b>.*?<\/b>)\s+(Battle:\s+<b>.*?<\/b>)<br>\s+.*?(Hospital\s+@\s+<b>.*?<\/b>)/gi); //Hier liest du die Sachen aus^^

while(helper = exp.exec(text)) {
    output += helper[1]+' '+helper[2]+' '+helper[3]+'<br>';
}
alert(output); // Alert? Das wär doch so nen Popup fenster?!

Danke für den Code. Wenn ich den jetzt noch verstehn würde wärs super. :ugly:
 
Ganz einfach: 3 Variablen ... die 1. hat die Anweisung auf der das Regex ausgeführt werden soll. Die 2. Variable ist für die Ausgabe und die 3. ist das Suchmuster
Dann kommt eine while Schleife die für alle gefundenen Textstellen die 3 mit Regex gesuchten Stellen in die 2. Variable steckt und am Ende wird mit dem Alert alles ausgegeben ... du musst natürlich kein alert nehmen ;)
 
Mal mit paar Kommentaren ;)

//deinen text, der durchsucht werden soll, in text speichern
var text = document.getElementById('in').innerHTML;

//in output steht am ende dein gefiltertes ergebnis
var output = '';

//regulären ausdruck zusammenbauen
var exp = new RegExp(/(Region:\s+<b>.*?<\/b>)\s+(Battle:\s+<b>.*?<\/b>)<br>\s+.*?(Hospital\s+@\s+<b>.*?<\/b>)/gi);


//deinen text text mit dem regulären ausdruck exp durchsuchen. da du vermutlich nicht nur das erste ergebnis haben willst, sondern alle, in ner while-schleife
while(helper = exp.exec(text)) {

//ergebnis zusammensetzen und an output anhängen
output += helper[1]+' '+helper[2]+' '+helper[3]+'<br>';

}

//output ausgeben - erstmal als alert. musst du entsprechend anpassen, an das, was du mit machen willst
alert(output);



quick&dirty kannst du dirs hier ansehen: https://web0.s070.cb-webhosting.de/js_match_all.html
Bei Fragen fragen!




edit:
mal eben greasemonkey angeguckt.
dein script müsste so aussehen (meine testurl natürlich durch deine ersetzen)

Code:
// ==UserScript==
// @name           Hospitals
// @namespace      kcaS | Sack
// @description    Fügt eine Liste der BW mit Hospitals in folgenden kämpfen ein.
// @include        *link*
// ==/UserScript==


GM_xmlhttpRequest({
  method: "GET",
  url: "https://web0.s070.cb-webhosting.de/js_match_all_text.html",
  onload: function(response) {

var text = response.responseText;
var output = '';
var exp = new RegExp(/(Region:\s+<b>.*?<\/b>)\s+(Battle:\s+<b>.*?<\/b>)<br>\s+.*?(Hospital\s+@\s+<b>.*?<\/b>)/gi);

while(helper= exp.exec(text)) {
output += helper[1]+' '+helper[2]+' '+helper[3]+'<br>';
}
var LinkDiv = document.createElement('div');
LinkDiv.id = 'LinkDiv';
LinkDiv.innerHTML = output;
document.getElementsByTagName("body")[0].appendChild(LinkDiv);

  }
});
 
Zuletzt bearbeitet:
Mal mit paar Kommentaren ;)

//deinen text, der durchsucht werden soll, in text speichern
var text = document.getElementById('in').innerHTML;

//in output steht am ende dein gefiltertes ergebnis
var output = '';

//regulären ausdruck zusammenbauen
var exp = new RegExp(/(Region:\s+<b>.*?<\/b>)\s+(Battle:\s+<b>.*?<\/b>)<br>\s+.*?(Hospital\s+@\s+<b>.*?<\/b>)/gi);


//deinen text text mit dem regulären ausdruck exp durchsuchen. da du vermutlich nicht nur das erste ergebnis haben willst, sondern alle, in ner while-schleife
while(helper = exp.exec(text)) {

//ergebnis zusammensetzen und an output anhängen
output += helper[1]+' '+helper[2]+' '+helper[3]+'<br>';

}

//output ausgeben - erstmal als alert. musst du entsprechend anpassen, an das, was du mit machen willst
alert(output);



quick&dirty kannst du dirs hier ansehen: https://web0.s070.cb-webhosting.de/js_match_all.html
Bei Fragen fragen!

Wow, danke! Ich hab tatsächlich alles verstanden :)
Jetzt muss ich nur noch das Script so integriert bekommen, dass es auf die Seite zugreift. Allerdings befindet sich da kein elemt mit einer ID oder so, das fängt direkt mit dem <h3> an. Kann ich da auch irgendwie sagen, dass es den ganzen body durchsuchen soll?

Mein Script sieht jetzt so aus:
Code:
// ==UserScript==
// @name           Hospitals
// @namespace      kcaS | Sack
// @description    Fügt eine Liste der BW mit Hospitals in folgenden kämpfen ein.
// @include        *erepublik.com*
// ==/UserScript==


//deinen text, der durchsucht werden soll, in text speichern
var text = document.getElementById('in').innerHTML;

//in output steht am ende dein gefiltertes ergebnis
var output = '';

//regulären ausdruck zusammenbauen
var exp = new RegExp(/(Region:\s+<b>.*?<\/b>)\s+(Battle:\s+<b>.*?<\/b>)<br>\s+.*?(Hospital\s+@\s+<b>.*?<\/b>)/gi);


GM_xmlhttpRequest({
    method: 'GET',
    url: 'http:/link.com/tool/hospitals.php',

    onload: function(responseDetails) {
	while(helper= exp.exec(text)) {
	output += helper[1]+' '+helper[2]+' '+helper[3]+'<br>';
	}
    }
});

//ergebnis zusammensetzen und an output anhängen
output += helper[1]+' '+helper[2]+' '+helper[3]+'<br>';

}

var LinkDiv = document.createElement('div');
LinkDiv.id = 'LinkDiv';
LinkDiv.innerHTML += output;
document.getElementById('shouts_component').appendChild(LinkDiv);

Müsste doch an sich alles richtig sein ausser, dass ich mit text noch auf das Falsche zugreife? Die müsste das gesamte dokument durchsuchen...


Auf jedenfall ein wahnsinnig großes Danke an alle die mir bisher geholfen haben!
Ohne eure Hilfe hätt ich das sicherlich nicht geschafft. Ich glaub ich guck mir Javascript doch noch mal richtig an. Greasemokey scripts sind cool :)
 
siehe mein edit oben ;)

da hab ich diese zeile drin, die es einfach ans ende der seite anhängt:
document.getElementsByTagName("body")[0].appendChild(LinkDiv);

könntest du für den h3 entsprechend anpassen:
document.getElementsByTagName("h3")[0].appendChild(LinkDiv);