# Inhalt einer Seite via PHP auslesen und mit Javascript auswerten ?



## ibanez (19. März 2014)

Hallo zusammen,

ich hab ein kleines problem und zwar würde ich gerne mit folgendem code den inhalt einer externen Seite abfragen (die Seite ist in meinem besitz) : 
	
	
	



```
$ch = curl_init("http://www.meineseite.de");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_BINARYTRANSFER, true);
$content = curl_exec($ch);
curl_close($ch);

echo $content;
```

Das funktioniert schonmal einwandfrei die Seite bzw. der Inhalt wird übergeben und angezeigt.

Jetzt würde ich gerne aus diesem Importieren Inhalt eine Div mit Java auslesen und wollte dafür folgenden Code benutzen:

```
<script language="javascript">function einsetzen(){
        var inhalt=document.getElementById('content-row2').innerHTML();
        alert(inhalt);
    }
	</script>
```

Und da bleibe ich hängen denn es kommt leider kein Alert  

was mache ich falsch ? PS: Bitte köpft mich nicht bin noch anfänger ^^


----------



## Parantatatam (19. März 2014)

Ich packe Dir erst einmal die Version so hin, wie ich sie schreiben würde:

```
<script type="application/javascript">
  function einsetzen() {
    var content = document.getElementById( 'content-row2' ).innerHTML;
    alert( content );
  }
</script>
```
Zum Verständnis: "innerHTML" ist keine Methode, sondern eine Eigenschaft von DOM-Elementen. Insofern gehören dahinter keine Klammern, wie bei einem Funktionsaufruf. Außerdem kannst du so etwas in Deinem Browser ausprobieren, in dem Du die Webkonsole öffnest (eigentlich jeder moderne Browser hat eine implementiert). Somit hättest Du den Fehler auch gesehen. Ansonsten sehe ich den Zusammenhang zwischen dem PHP-Skript und dem JavaScript-Schnipsel nicht.

PS: Java != JavaScript


----------



## ibanez (19. März 2014)

Hi, Danke erstmal für die lernstunden und die korrektur.

Der zusammenhang mit dem PHP und dem Javascript besteht darin das ich am Ende des PHP scripts mit 
	
	
	



```
echo $content;
```

ja den Inhalt der abgefragten Seite angezeigt bekomme. Im Quellcode der abgerufenen Seite existiert eine Div mit der ID "content-row2" und den Inhalt dieser Div würde ich gerne mit dem Javascript auswerten-/lesen um ihn danach weiter zu verarbeiten.


----------



## Parantatatam (19. März 2014)

Dann solltest du diese Verarbeitung aber auch mit PHP und dem DOM-Parser vornehmen.

```
$ch = curl_init( 'http://www.meineseite.de' ); 
curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true ); 
curl_setopt( $ch, CURLOPT_BINARYTRANSFER, true ); 
$content = curl_exec( $ch ); 
curl_close( $ch );

$doc = new DOMDocument();
$doc->loadHTML( $content );
$element = $doc->getElementById( 'content-row2' );
$element = ( $element === null ) ? '' : $element->nodeValue;

echo $element;
```


----------



## ibanez (19. März 2014)

Den Inhalt den ich auslesen lassen wollte habe ich jetzt danke dafür. Wenn du mir jetzt noch vielleicht erklären kannst wie ich es in die ursprüngliche formatierung bekomme bzw. wie ich die formatierung übernehmen kann wäre ich dir sehr verbunden den teil aktuell bis hier hin habe ich verstanden wusste garnicht das man mit dem DOM-Paser soviel machen kann sollte ich mich vllt. nochmal genauer einlesen !


----------



## Parantatatam (19. März 2014)

Wenn Du mir jetzt noch sagst, was Du haben möchtest, dann kann ich Dir bestimmt auch noch weiterhelfen. Willst Du das ausgelesene Element auf einer eigenen Webseite direkt ausgeben? Oder willst Du es mit AJAX nachladen? Willst Du die Daten weiter analysieren und dann nur bestimmte Werte daraus nutzen? Oder willst Du etwas ganz anderes?


----------



## ibanez (19. März 2014)

Also die werte die das Script ausliest ist eine Tabelle mit mehreren Zeilen und Spalten und ich würde einfach nur gerne die werte auslesen und auch so in der Tabellen form wieder geben. Für die weiteren auswertungen werde ich dann erstmal wieder selber lesen und forschen mir geht es ja nicht darum den ganzen weg geschenkt zu bekommen sondern ich will den ganzen kram lernen dadurch das du mir hilfst wofür ich dir sehr dankbar bin komme ich dem "Standartaufbau" immer näher und kann dann weiter lernen. Allerdings wäre für mich primär das Ziel erstmal die daten auszulesen und genauso wieder zu geben wie Sie ursprünglich dargestellt sind. PS: ich würde die Daten direkt auf einer anderen Seite die als Statistik dient wiedergeben.


----------



## Parantatatam (19. März 2014)

Wenn du nur das haben willst, musst du eben folgendes an der richtigen Stelle ausführen:

```
<!DOCTYPE html>
<html>
<head>
  <title>Meine Webseite</title>
  <meta charset="utf-8" />
</head>
<body>
  <div><?php echo $element ?></div>
</body>
</html>
```
Hierbei ist das nur ein Beispiel, wie das Ganze aussehen könnte.


----------



## ibanez (19. März 2014)

Problem hierbei ist das er Alle werte als fliestext ausgibt und nicht in die Tabellen form bringt


----------



## ComFreek (19. März 2014)

Probier das hier mal aus:

```
<?php

$html = '';
foreach($element->childNodes as $node) {
   $html .= $dom->saveHTML($node);
}

?>
<div><?php echo $html; ?></div>
```
Quelle: http://stackoverflow.com/a/7156111/603003


----------



## ibanez (19. März 2014)

Leider auch das hat nichts gebracht es wird nichts ausgegeben ich poste nochmal meinen bisherigen gesamt code :


```
<head>
<meta charset="utf-8">
<title>Statistik</title>

    
    <script src="/sources/default.js" type="text/javascript"></script>
    

</head>

<body>
<?php
$ch = curl_init( 'http://www.meineseite.de' ); 
curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true ); 
curl_setopt( $ch, CURLOPT_BINARYTRANSFER, true ); 
$content = curl_exec( $ch ); 
curl_close( $ch );
 
$doc = new DOMDocument();
$doc->loadHTML( $content );
$element = $doc->getElementById( 'content-row2' );
$element = ( $element === null ) ? '' : $element->nodeValue;
 
echo $element;


?>


</body>
```

Bis hier hin bekomme ich alle Daten nur als Fliesstext und ohne die richtige Formatierung der Tabelle bzw. ohne Tabelle


----------



## ComFreek (19. März 2014)

ibanez hat gesagt.:


> Leider auch das hat nichts gebracht es wird nichts ausgegeben ich poste nochmal meinen bisherigen gesamt code :



Und wie genau hattest du meinen Code verwendet?


----------



## ibanez (19. März 2014)

Ich habe Ihn so eingefügt:


```
head>
<meta charset="utf-8">
<title>Statistik</title>

    
    <script src="/sources/default.js" type="text/javascript"></script>
    

</head>

<body>
<?php
$ch = curl_init( 'http://www.meineseite.de' ); 
curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true ); 
curl_setopt( $ch, CURLOPT_BINARYTRANSFER, true ); 
$content = curl_exec( $ch ); 
curl_close( $ch );
 
$doc = new DOMDocument();
$doc->loadHTML( $content );
$element = $doc->getElementById( 'content-row2' );
$element = ( $element === null ) ? '' : $element->nodeValue;
 
echo $element;
/////////////////////////////////////////////////////////////DEIN CODE//////////////////////////////////////////77
$html = '';
foreach($element->childNodes as $node) {
   $html .= $dom->saveHTML($node);
}
?>

<div><?php echo $html; ?></div>

</body>
```


----------



## ComFreek (19. März 2014)

Was gibt dir Folgendes aus?


```
$html = ''; 
foreach($element->childNodes as $node) { 
   $html .= $dom->saveHTML($node); 
} 
var_dump($html);
?> 
 
<div><?php echo $html; ?></div>
```


----------



## ibanez (19. März 2014)

Nothing


----------



## ComFreek (20. März 2014)

Das kann ganz sicher nicht sein!

var_dump() gibt in jedem Fall etwas aus. Hast du dir auch den HTML-Quelltext der Ausgabe angeschaut?


----------



## ibanez (20. März 2014)

Vielleicht hab ich etwas falsch gemacht hilfreich zum verlgeich wäre für mich wenn du evtl. die vorhergegangen codes so zusammen bastelst das dein code etwas ausspuckt da er das bei mir definitiv nicht macht. Ich werde es mir aber nachher wenn ich zuhause bin nochmal näher betrachten. Danke für deine Hilfe im voraus !


----------



## ComFreek (20. März 2014)

Einfach mal kopiert und meine Zeile eingefügt:

```
head> 
<meta charset="utf-8"> 
<title>Statistik</title> 

     
    <script src="/sources/default.js" type="text/javascript"></script> 
     

</head> 

<body> 
<?php 
$ch = curl_init( 'http://www.meineseite.de' );  
curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true );  
curl_setopt( $ch, CURLOPT_BINARYTRANSFER, true );  
$content = curl_exec( $ch );  
curl_close( $ch ); 
  
$doc = new DOMDocument(); 
$doc->loadHTML( $content ); 
$element = $doc->getElementById( 'content-row2' ); 
$element = ( $element === null ) ? '' : $element->nodeValue; 

# Auskommentieren! (Nur dafür, dass du die untere var_dump()-Ausgabe
# leicht erkennen kannst
#echo $element; 
/////////////////////////////////////////////////////////////DEIN CODE//////////////////////////////////////////77 
$html = ''; 
foreach($element->childNodes as $node) { 
   $html .= $dom->saveHTML($node); 
}
var_dump($html);
?> 
 
<div><?php echo $html; ?></div> 

</body>
```


PS: Falls du irgendwann mal Zeit zur Verfügung hast, lies dir mal die Nutzung von XDebug an. Mit einer guten IDE setzt du einfach einen Breakpoint nach dem ForEach und kannst den Wert von $html einfach in der IDE einsehen. Ganz ohne var_dump()/echo/etc.!


----------



## ibanez (20. März 2014)

Okay der var_dump gibt folgendes ergebnis aus "string(0) ""


----------



## ComFreek (21. März 2014)

Achso, natürlich! Die Variable $dom gibt es bei dir gar nicht! Die heißt bei dir $doc. Trotzdem solltest du Warnungen bzgl. der undeklarierten Variable bekommen haben! D. h. du solltest mal dein Error-Reporting so setzen:

```
// Nur für den Entwicklungsmodus... nicht live auf einer Website nutzen!
ini_set('display_errors', 1);
error_reporting(E_ALL);
```

Nun ersetze eben $dom durch $doc.


----------



## ibanez (24. März 2014)

Also ich hab jetzt das konzept jetzt mal ein bisschen umgeworfen weil ich zu keinem vernüftigen Ergebnis gekommen bin.

Ich habe die Datei jetzt lokal auf dem Server liegen. 

Jetzt würde ich gerne aus diesem Format als Bsp.


```
<td width="100%"><b><font face="Arial" size="2">
      <img border="0" src="Bilder/newsdrehend.gif" width="36" height="11">
        </font>
        <u><font face="Arial" size="4">59</font></u></b><u><b><font face="Arial" size="4">7. 
      Kevin Hartmann Kreisranglistensieger</font></b></u><span style="FONT-FAMILY: 'Arial','sans-serif'"><br>
      </span>
      <br>
      <span style="font-weight: 700"><font face="Arial, sans-serif" size="2">
      Kevin Hartmann hat Platz 1 bei den Kreisranglisten in Braunfels erreicht. 
      Mit 15:6 Sätzen bei 5:1 Spielen setzte er sich vor Daniel Kaiser (Hohenroth) 
      und Johann Armin Sander (SG Oberbiel) durch.<br>
      Bei den Spielen in Braunfels ging es nicht nur um die Platzierung im 
      Kreis, sondern auch um die Qualifikation für die Bezirksrangliste am 24. 
      und 25.Mai in Königstein, die Kevin mit Rang 1 natürlich erreicht hat. 
      Herzlichen Glückwunsch!<br>
&nbsp;</font></span></td>
```

Einmal die Überschrift extrahieren in diesem Fall ist das dieser Teil:

```
<u><font face="Arial" size="4">59</font></u></b><u><b><font face="Arial" size="4">7. 
      Kevin Hartmann Kreisranglistensieger</font></b></u>
```

und einmal den Newscontent:


```
<span style="font-weight: 700"><font face="Arial, sans-serif" size="2">
      Kevin Hartmann hat Platz 1 bei den Kreisranglisten in Braunfels erreicht. 
      Mit 15:6 Sätzen bei 5:1 Spielen setzte er sich vor Daniel Kaiser (Hohenroth) 
      und Johann Armin Sander (SG Oberbiel) durch.<br>
      Bei den Spielen in Braunfels ging es nicht nur um die Platzierung im 
      Kreis, sondern auch um die Qualifikation für die Bezirksrangliste am 24. 
      und 25.Mai in Königstein, die Kevin mit Rang 1 natürlich erreicht hat. 
      Herzlichen Glückwunsch!<br>
&nbsp;</font></span>
```

Wohl bemerkt möchte ich nur den Inhalt haben die Formatierung spielt hierbei keine Rolle mehr.

Grund dafür ist das ich die gesamten News Artikel der alten HTML basierten Seite in die Neue PHP basierende Seite einfügen möchte und das am Besten Automatisiert.

Nun dachte ich mir okay dann wird die betreffende Datei erstmal inlcuded:

```
include ('news.html');
```

und dann mit regex die jeweiligen Teile Headline & content rausfiltern (Wo es schon problematisch wird weil ich es nicht schaffe beide Teile in einem preg_match befehl unter zu bringen.


Wenn das dann alles funktioniert (587 News Einträge), soll dann alle jeweils gefilterten Headlines in $headline[$i] zusammengefasst werden und die jeweiligen contents in $message[$i] um danach alle News via:


```
mysql_query("INSERT INTO ".PREFIX."news_contents (newsID, language, headline, content) VALUES ('".$newsID."', '".$lang[$i]."', '".$headline[$i]."', '".$message[$i]."')");
```

Ins System zu übertragen. Ist sowas möglich und wenn Ja wieviel Arbeitszeit muss ich Rechnen ?


----------



## ibanez (1. April 2014)

Keiner eine Idee ?


----------



## ComFreek (1. April 2014)

1. Nicht mit include/require!

2. Lade die Datei (file_get_contents)

3. Nutze einen XML-Parser (DOMDocument ist bspw. in PHP integriert)

4. Extrahiere den Inhalt

5. Füge den deinen Daten hinzu (besser ein großes Array statt mehrere einzelner, du kannst auch gleich eine Klasse NewsArticle erstellen => Kapselung)

6. Die alte mysql_-Erweiterung nicht mehr nutzen, wenn du irgendwie kannst! MySQLi oder PDO. Bei MySQLi Prepared Statements nutzen. (Erklärungen, Verweise findest du im Internet)



Arbeitszeit: wenn es flott geht, 45 - 60 min - Komplikationen eingerechnet. Wenn alles glatt läuft, vllt. auch nur 15 min.


----------



## ibanez (2. April 2014)

Bisher bin ich soweit gekommen hab mir gedacht ich Filter den ganzen Inhalt nach dem <u> Tag da dieser in jeder Headline verwendet wurde, nur bezweifel ich irgendwie das da alles richtig ist weil wenn ich per echo oder print_r das array $element ausgebe kommt garnix.




```
<?php
// News laden
  $content = file_get_contents("news.html");
  
// Verarbeitung mit dem XML Parser (Headline filter für das <u>-Tag

	$dom = new DOMDocument(); 
	$dom->loadHTML( $content ); 
	$element = $dom->getElementsByTagName( "u" ); 
	$element = ( $element === null ) ? '' : $element->nodeValue;  
	
	
  
?>
```


----------

