使用 xpath 选择 css 类

2022-08-30 07:56:12

我只想选择一个名为 .date 的类

由于某种原因,我无法让它工作。如果有人知道我的代码有什么问题,那将不胜感激。

@$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." ";
}

答案 1

我想写这个问题的规范答案,因为上面的答案有问题。

我们的问题

CSS 选择器:

.foo

将选择具有类 foo 的任何元素。

如何在 XPath 中执行此操作?

尽管 XPath 比 CSS 更强大,但 XPath 没有 CSS 类选择器的本机等效项。但是,有一个解决方案。

正确的方法

XPath 中的等效选择器是:

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

函数规范化空格条带前空格和尾随空格(并且还用单个空格替换空格字符序列)。

(在更一般的意义上)这也相当于CSS选择器:

*[class~="foo"]

它将匹配其属性值是空格分隔值列表的任何元素,其中一个值正好等于 foo

几种明显但错误的方法

XPath 选择器:

//*[@class="foo"]

不起作用!因为它与具有多个类的元素不匹配,例如

<div class="foo bar">

如果类名周围有任何额外的空格,它也不匹配:

<div class="  foo ">

“改进的”XPath 选择器

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

也不起作用!因为它错误地将元素与类 foobar 匹配,例如

<div class="foobar">

这要归功于这个家伙,他是我在网络上发现的这个问题的最早发表的解决方案:http://dubinko.info/blog/2007/10/01/simple-parsing-of-space-seprated-attributes-in-xpathxslt/


答案 2

//[@class="date"]不是有效的 x 路径。

尝试 ,或者如果您知道它是图像,//*[@class="date"]//img[@class="date"]


推荐