Ich verwende PHP-DOM und versuche, ein Element innerhalb eines DOM-Knotens mit einem bestimmten Klassennamen abzurufen. Was ist der beste Weg, um dieses Unterelement zu erhalten?
Update: Am Ende habe ich Mechanize
PHP verwendet, mit dem ich viel einfacher arbeiten konnte.
Antworten:
Update: Xpath-Version des
*[@class~='my-class']
CSS-SelektorsNach meinem Kommentar als Antwort auf den Kommentar von hakre wurde ich neugierig und schaute in den Code dahinter
Zend_Dom_Query
. Es sieht so aus, als ob der obige Selektor zu folgendem xpath (ungetestet) kompiliert wurde:[contains(concat(' ', normalize-space(@class), ' '), ' my-class ')]
so wäre das php:
Grundsätzlich normalisieren wir hier nur das
class
Attribut, sodass auch eine einzelne Klasse durch Leerzeichen und die gesamte Klassenliste durch Leerzeichen begrenzt wird. Fügen Sie dann die gesuchte Klasse mit einem Leerzeichen hinzu. Auf diese Weise suchen und finden wir effektiv nur Instanzen vonmy-class
.Xpath-Selektor verwenden?
Wenn es sich immer nur um einen Elementtyp handelt, können Sie den
*
durch den jeweiligen Tagnamen ersetzen .Wenn Sie viel davon mit einem sehr komplexen Selektor tun müssen, würde ich empfehlen,
Zend_Dom_Query
der die CSS-Selektorsyntax (a la jQuery) unterstützt:quelle
my-class2
auch, aber ziemlich süß. Gibt es eine Möglichkeit, nur das erste aller Elemente auszuwählen?class
kann mehr als eine Klasse haben zum Beispiel :<a class="my-link link-button nav-item">
.//*[contains(concat(' ', normalize-space(@class), ' '), ' classname ')]
(Sehr informativ: CSS-Selektoren und XPath-Ausdrücke ).contains
in Kombination mitconcat
... verwenden. Wir diskutieren nur die Einzelheiten des Auffüllens der Leerzeichen auf beiden Seiten der Klasse, nach der Sie suchen, oder nur das Auffüllen einer Seite. Beides sollte aber funktionieren.Wenn Sie das Innerhtml der Klasse ohne das Zend erhalten möchten, können Sie Folgendes verwenden:
quelle
$classname = 'main-article'
Ich denke, der akzeptierte Weg ist besser, aber ich denke, das könnte auch funktionieren
quelle
$classResult = getElementByClass($dom, 'div', 'm-signature-pad'); $classResult->nodeValue = ''; $enode = $dom->createElement('img'); $enode->setAttribute('src', $signatureImage); $classResult->appendChild($enode);
Es gibt auch einen anderen Ansatz ohne die Verwendung von
DomXPath
oderZend_Dom_Query
.Basierend auf der ursprünglichen Funktion von dav habe ich die folgende Funktion geschrieben, die alle untergeordneten Knoten des übergeordneten Knotens zurückgibt, deren Tag und Klasse mit den Parametern übereinstimmen.
Angenommen, Sie haben eine Variable mit
$html
folgendem HTML-Code:Die Verwendung von
getElementsByClass
ist so einfach wie:quelle
DOMDocument ist langsam zu tippen und phpQuery hat Probleme mit Speicherverlusten. Am Ende habe ich verwendet:
https://github.com/wasinger/htmlpagedom
So wählen Sie eine Klasse aus:
Ich hoffe, das hilft auch jemand anderem
quelle