Frage zu DOM XPath (Auslesen/Parsen von Webseiten)

Moin,

hier mein Script (im neuen Thema :))

 <?
//error_reporting(E_ERROR | E_WARNING | E_PARSE);

$curl = curl_init('http://www.hamburg.de/clp/bgv/temperatur-alster/clp1/');
curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($curl, CURLOPT_USERAGENT,'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.13) Gecko/20080311 Firefox/2.0.0.13');
$page = curl_exec($curl);
//print_r($page);


if(curl_errno($curl)) // Error-Check
{
    echo 'Scraper error: ' . curl_error($curl);
    exit;
}
curl_close($curl);

$DOM = new DOMDocument;
//print_r($DOM);


libxml_use_internal_errors(true);

if (!$DOM->loadHTML($page))
    {
        $errors="";
        foreach (libxml_get_errors() as $error)  {
            $errors.=$error->message."<br/>";
        }
        libxml_clear_errors();
        print "libxml errors:<br>$errors";
        return;
    }
$xpath = new DOMXPath($DOM);


// Temperatur Alster
$content = $xpath->query('//*[@id="clip4119202"]/table/tbody/tr[2]/td[4]');
foreach ($content as $entry1) {
    $output[] = $entry1->nodeValue;
}
print_r($output);
?>

Sieht anscheinend so aus das ich XPath wohl bei dieser Seite nicht anwenden kann.

Hat jemand einen Tip wie es doch funktioniert?

Hein09

Die Seite lässt sich nicht so schön parsen und wenn sie sich ändert funktioniert das ganze natürlich nicht mehr.

Ohne XPath und „von Hand“ ;):

<?

$curl = curl_init('http://www.hamburg.de/clp/bgv/temperatur-alster/clp1/');
curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($curl, CURLOPT_USERAGENT,'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.13) Gecko/20080311 Firefox/2.0.0.13');
$page = curl_exec($curl);

if(curl_errno($curl)) // Error-Check
{
    echo 'Scraper error: ' . curl_error($curl);
    exit;
}
curl_close($curl);

$temp = (float)str_replace('<td> ', '', get_mark($page, '<td> Wassertemperatur </td> * </td>' )[0]);

echo "Temperatur: ".$temp;


// Diese Funktion trennt die relevanten Bereiche aus dem Ausschnitt heraus $string ist dabei der zu 
// durchsuchende Gesamtstring, in $Mark sind durch "*" getrennt der Beginn des zu suchenden Strings 
// und das Ende des zu suchende Abschnittes.
// Beispiel für den Text "<div>*</div></li>"

function get_mark($string,$mark) {
	$ausgabe = array();
	$template = explode("*",$mark);
	$mark = $template[0];
	$end = $template[1];
	$string = strstr($string,$mark);
	$temp = explode($mark,$string);
	$a = 1;
	foreach ($temp as $tempx) {
		$tempx = explode($end,$tempx);
		$tempx = $tempx[0];
		if ($tempx) {
			array_push ($ausgabe,$tempx);
		}
	}
	return $ausgabe;
}

?>

vielen Dank für das Beispiel.

Klappt das denn bei der Seite mit XPath nicht?

Hein09

Hallo Ralf,

ich habe Dein Script noch nicht ganz verstanden.

Und zwar möchte ich auch den Wert „Lufttemperatur“ mit ausgelesen haben.

Wo muss ich was in Deinen Script einfügen damit ich auch die Lufttemperatur mit auslesen kann?

Es wäre toll wenn Du mir auch da weiterhelfen kannst.

Hein09

Einfach die Zeile mit „get_mark“ duplizieren, „Wassertemperatur“ auf „Lufttemperatur“ ändern und dann sieht das so aus :slight_smile:

<?

$curl = curl_init('http://www.hamburg.de/clp/bgv/temperatur-alster/clp1/');
curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($curl, CURLOPT_USERAGENT,'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.13) Gecko/20080311 Firefox/2.0.0.13');
$page = curl_exec($curl);

if(curl_errno($curl)) // Error-Check
{
    echo 'Scraper error: ' . curl_error($curl);
    exit;
}
curl_close($curl);

$lufttemp = (float)str_replace('<td> ', '', get_mark($page, '<td> Lufttemperatur </td> * </td>' )[0]);
$wassertemp = (float)str_replace('<td> ', '', get_mark($page, '<td> Wassertemperatur </td> * </td>' )[0]);

echo "Lufttemperatur: ".$lufttemp.PHP_EOL;
echo "Wassertemperatur: ".$wassertemp;


// Diese Funktion trennt die relevanten Bereiche aus dem Ausschnitt heraus $string ist dabei der zu
// durchsuchende Gesamtstring, in $Mark sind durch "*" getrennt der Beginn des zu suchenden Strings
// und das Ende des zu suchende Abschnittes.
// Beispiel für den Text "<div>*</div></li>"

function get_mark($string,$mark) {
    $ausgabe = array();
    $template = explode("*",$mark);
    $mark = $template[0];
    $end = $template[1];
    $string = strstr($string,$mark);
    $temp = explode($mark,$string);
    $a = 1;
    foreach ($temp as $tempx) {
        $tempx = explode($end,$tempx);
        $tempx = $tempx[0];
        if ($tempx) {
            array_push ($ausgabe,$tempx);
        }
    }
    return $ausgabe;
}

?>

Grüße,
Chris

Vielen Dank,

habe aber schon wieder eine Frage:)

Wo kann man einstellen das bei der Lufttemperatur auch die werte nach dem Komma angezeigt werden?

Hein09

Das Skript würde die Werte nach dem Komma anzeigen, aber weil ,0 nicht angezeigt wird gibt es das „echo“ nicht aus. Schreib es in eine Float-Variable und schon steht da 1,0 (wenn du im Variablenprofil eine Stelle nach dem Komma definiert hast) :wink:

Versuch macht klug…und…selbst ist der Mann :wink: :smiley:

Grüße,
Chris