为了账号安全,请及时绑定邮箱和手机立即绑定

使用XPath选择CSS类

/ 猿问

使用XPath选择CSS类

慕仙森 2019-10-12 07:07:07

使用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." ";

}


查看完整描述

3 回答

?
慕工程0101907

我想写这个问题的典型答案,因为上面的答案有一个问题。

我们的问题

这个CSS选择器:

.foo

将选择具有该类的任何元素。福.

如何在XPath中做到这一点?

虽然XPath比CSS更强大,XPath没有CSS类选择器的本地等效..然而,有一个解决办法。

正确的方法

中的等效选择器XPath是:

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

功能正规化空间带前导和尾随空格(也用单个空格替换空白字符序列)。

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

*[class~="foo"]

,它将匹配任何元素班级,等级属性值是空格分隔的值的列表,其中之一完全等于福.

有几种明显但错误的方法

XPath选择器:

//*[@class="foo"]

不管用!因为它不匹配有多个类的元素,例如

<div class="foo bar">

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

<div class="  foo ">

改进的XPath选择器

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

也没用!因为它错误地将元素与类匹配。前叶,例如

<div class="foobar">

归功于这个家伙,他是我在网上发现的最早的解决这个问题的方法:http:/dubinko.info/blog/2007/10/01/简单-空间解析-分离-属性-in-xpath xslt/



查看完整回答
反对 回复 2019-10-13
?
偶然的你

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

试一试//*[@class="date"]或者如果你知道这是一幅图像,//img[@class="date"]


查看完整回答
反对 回复 2019-10-13
?
RISEBY

XPath 3.1引入一种功能包含-令牌从而最终解决了这一“正式”问题。它被设计成支援类.

例子:

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

此函数确保空白(不仅是(U+0020)被正确处理,在类名重复的情况下工作,通常覆盖边缘情况。


注:截至今天(2016-12-13),XPath 3.1的状态为候选人推荐.



查看完整回答
反对 回复 2019-10-13

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信