87 votes

Sélection d'une classe CSS avec xpath

Je veux juste choisir une classe appelée .date

Pour une raison quelconque, je ne peux pas que cela fonctionne. Si quelqu'un sait ce qui ne va pas avec mon code, ce serait très apprécié.

 @$doc = new DOMDocument();
@$doc->loadHTML($html);
$xml = simplexml_import_dom($doc); // just to make xpath more simple
$images = $xml->xpath('//[@class="date"]');                             
foreach ($images as $img)
{
    echo  $img." ";
}
 

244voto

user716736 Points 816

Je veux écrire la réponse canonique à cette question, car la réponse ci-dessus a un problème.

Notre problème

Le CSS selector:

.foo

permettra de sélectionner n'importe quel élément qui a la classe foo.

Comment faites-vous cela dans XPath?

Bien que XPath est plus puissant que les CSS, XPath n'est pas un natif de l'équivalent d'une classe CSS. Cependant, il existe une solution.

La bonne façon de le faire

L'équivalent selector XPath est:

//*[contains(concat(" ", normalize-space(@class), " "), " foo ")]

La fonction normalize-space bandes d'attaque et de fuite des espaces (et remplace également les séquences de caractères espace par un espace).

(Dans un sens plus général) c'est aussi l'équivalent du sélecteur CSS:

*[class~="foo"]

qui va correspondre à tout élément dont la classe de la valeur de l'attribut est une liste des espaces de valeurs séparées, dont l'une est exactement égale à toto.

Un couple d'évident, mais les mauvaises façons de le faire

Le selector XPath:

//*[@class="foo")]

ne fonctionne pas! parce que ça ne correspond pas à un élément qui a plus d'une classe, par exemple

<div class="foo bar">

Elle a également remporté le match pas si il n'y a aucun supplément de l'espace autour du nom de la classe:

<div class="  foo ">

Le "amélioré" selector XPath

//*[contains(@class, "foo")]

ne fonctionne pas non plus! parce qu'il correspond à tort les éléments avec la classe de foobar, par exemple

<div class="foobar">

Le crédit va à ce gars, qui a été le premier publié solution à ce problème que j'ai trouvé sur le web: http://dubinko.info/blog/2007/10/01/simple-parsing-of-space-seprated-attributes-in-xpathxslt/

11voto

MrGlass Points 3374

//[@class="date"] n'est pas un xpath valide.

Essayez //*[@class="date"] , ou si vous savez que c'est une image, //img[@class="date"]

1voto

hakre Points 102271

Le HTML autorise les noms d’attributs et d’éléments insensibles à la casse, puis class est une liste de noms de classes séparée par des espaces. Ici nous allons pour une balise img et les class nommés date :

 //*['IMG' = translate(name(.), 'abcdefghijklmnopqrstuvwxyz', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')]/@*['CLASS' = translate(name(.), 'abcdefghijklmnopqrstuvwxyz', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ') and contains(concat(' ', normalize-space(.), ' '), concat(' ', 'date', ' '))]
 

Voir aussi: Conversion du sélecteur CSS en XPath

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X