Holen Sie sich das Element nach ClassName mit der DOMdocument()-Methode

Lesezeit: 2 Minuten

Holen Sie sich das Element nach ClassName mit der DOMdocument Methode
gerecht

Folgendes versuche ich zu erreichen: Rufen Sie alle Produkte auf einer Seite ab und fügen Sie sie in ein Array ein. Hier ist der Code, den ich verwende:

$page2 = curl_exec($ch);
$doc = new DOMDocument();
@$doc->loadHTML($page2);
$nodes = $doc->getElementsByTagName('title');
$noders = $doc->getElementsByClassName('productImage');
$title = $nodes->item(0)->nodeValue;
$product = $noders->item(0)->imageObject.src;

Es funktioniert für die $title but nicht für das Produkt. Zur Info, im HTML-Code sieht das img-Tag so aus:

<img alt="" class="productImage" data-altimages="" src="https://stackoverflow.com/questions/20728839/xxxx">

Ich habe mir das angesehen (PHP DOMDocument how to get element?), aber ich verstehe immer noch nicht, wie es funktioniert.

PS: Ich bekomme diesen Fehler:

Aufruf der undefinierten Methode DOMDocument::getElementsByclassName()

  • Diese Frage ist seltsam, da OP seine eigene nicht existierende Methode entwickelt.

    – Raubvogel

    24. Dezember 2014 um 7:17 Uhr

Ich habe schließlich die folgende Lösung verwendet:

    $classname="blockProduct";
    $finder = new DomXPath($doc);
    $spaner = $finder->query("//*[contains(@class, '$classname')]");

  • Eine korrektere xpath-Variante wird als Antwort in einer doppelten Frage präsentiert: Call to undefined method DOMDocument::getElementsByClassName()

    – hakre

    31. Oktober 2015 um 16:13 Uhr

Holen Sie sich das Element nach ClassName mit der DOMdocument Methode
Ulad Kasach

https://stackoverflow.com/a/31616848/3068233

Verknüpfen Sie diese Antwort, da sie mir bei diesem Problem am meisten geholfen hat.

function getElementsByClass(&$parentNode, $tagName, $className) {
    $nodes=array();

    $childNodeList = $parentNode->getElementsByTagName($tagName);
    for ($i = 0; $i < $childNodeList->length; $i++) {
        $temp = $childNodeList->item($i);
        if (stripos($temp->getAttribute('class'), $className) !== false) {
            $nodes[]=$temp;
        }
    }

    return $nodes;
}

Theres der Code und heres die Verwendung

$dom = new DOMDocument('1.0', 'utf-8');
$dom->loadHTML($html);
$content_node=$dom->getElementById("content_node");

$div_a_class_nodes=getElementsByClass($content_node, 'div', 'a');

  • Passen Sie auf, das Stripos-Check in dieser Funktion kann zu Fehlalarmen führen. Wenn Sie eine Klasse wie FormRowHeader haben, würde sie für FormRow immer noch true zurückgeben.

    – Robert Sinclair

    10. Mai 2019 um 19:58 Uhr


  • Warum testest du nicht einfach, ob $temp->getAttribute('class') == $className? Es würde den von @RobertSinclair festgelegten Fehler vermeiden.

    – Rodrigo

    14. November 2021 um 4:20 Uhr

  • Warum das & in $parentNode?

    – Rodrigo

    14. November 2021 um 4:23 Uhr

function getElementsByClassName($dom, $ClassName, $tagName=null) {
    if($tagName){
        $Elements = $dom->getElementsByTagName($tagName);
    }else {
        $Elements = $dom->getElementsByTagName("*");
    }
    $Matched = array();
    for($i=0;$i<$Elements->length;$i++) {
        if($Elements->item($i)->attributes->getNamedItem('class')){
            if($Elements->item($i)->attributes->getNamedItem('class')->nodeValue == $ClassName) {
                $Matched[]=$Elements->item($i);
            }
        }
    }
    return $Matched;
}

// usage

    $dom = new \DOMDocument('1.0'); 
    @$dom->loadHTML($html);
    $elementsByClass = getElementsByClassName($dom, $className, 'h1');

844330cookie-checkHolen Sie sich das Element nach ClassName mit der DOMdocument()-Methode

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy