Über Web, Tech, Games, Art,
Code & Design

6. Oktober 2023

SimpleHTMLDom-Alternative

Viele Jahre habe ich „SimpleHTMLDom“ eingesetzt um Inhalte externer Websites, wie z.B. Jobs, News etc. auszulesen. Immer häufiger bin ich damit in letzter Zeit an die Grenzen von SimpleHTMLDom geraten. Sobald ein HTML-Dokument sehr groß ist (> 1MB) hat SimpleHTMLDom oft einen Fehler 500 erzeugt.

Die Alternative: Die PHP-Klasse DOMXPath! DOMXPath scheint auf den ersten Blick ein bisschen komplizierter als SimpleHTMLDom, ist aber deutlich performanter und kommt auch mit größeren Datenmengen sehr gut klar.

Ein Beispiel: Folgender Code gibt die Jobs in Musterstadt der Seite beispiel.de aus.

$html = file_get_contents('https://www.BEISPIEL.de/jobs');

$dom = new DOMDocument();
$dom->loadHTML($html);

$xpath = new DOMXPath($dom);

$elements = $xpath->query('//div[contains(@class, "element-item")]');

foreach ($elements as $element) {
    $title = $xpath->query('.//div[contains(@class, "title")]', $element)->item(0)->nodeValue;
    $url = $xpath->query('.//a', $element)->item(0)->getAttribute('href');
    echo '<a href="' . $url . '">' . $title . '</a><br>';
}Code-Sprache: PHP (php)

Alternativ mit curl:

$ch = curl_init();
$url = 'https://www.BEISPIEL.de/jobs';

curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

$response = curl_exec($ch);

if($response === false) {
    echo 'cURL Error: ' . curl_error($ch);
} else {
    $dom = new DOMDocument();
    @$dom->loadHTML($response); 

    $xpath = new DOMXPath($dom);
    $elements = $xpath->query('//div[contains(@class, "element-item")]');

    foreach ($elements as $element) {
    $title = $xpath->query('.//div[contains(@class, "title")]', $element)->item(0)->nodeValue;
    $url = $xpath->query('.//a', $element)->item(0)->getAttribute('href');
    echo '<a href="' . $url . '">' . $title . '</a><br>';
  }
}

curl_close($ch);Code-Sprache: PHP (php)

Ein Cheatsheet zur Syntax findet sich hier: https://devhints.io/xpath

Ansonsten ist Chat GPT auch eine große Hilfe bei der Erstellung des Codes. 😉


Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert