使用 xpath 选择一个 css 类

新手上路,请多包涵

我只想自己选择一个名为 .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." ";
}

原文由 Teddy13 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 384
2 个回答

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

我们的问题

CSS 选择器:

 .foo

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

你如何在 XPath 中做到这一点?

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

正确的做法

XPath 中的等效选择器是:

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

函数 normalize-space 去除前导和尾随空白(并且还用单个空格替换空白字符序列)。

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

 *[class~="foo"]

它将匹配任何其 class 属性值为空格分隔值列表的元素,其中一个值恰好等于 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-在-xpathxslt/

原文由 user716736 发布,翻译遵循 CC BY-SA 4.0 许可协议

//[@class="date"] 不是有效的 xpath。

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

原文由 MrGlass 发布,翻译遵循 CC BY-SA 3.0 许可协议

推荐问题