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
Mit diesem Tool können CSS-Selektoren in X-Path gewandelt werden: https://css2xpath.github.io/
Ansonsten ist Chat GPT auch eine große Hilfe bei der Erstellung des Codes. 😉