php之xpath类,关于php:使用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."";

}

那一段html呢? (更喜欢向我们展示asXML()的simpleXml输出,因为它更接近xpath)

如果有多个类,则需要执行contains(@class, date)

PHP的可能重复项-解析" href"标签中包含特定单词的所有链接

XPath的可能重复项:如何匹配包含某个字符串的属性

@Gordons答案很危险,如果class属性为" datetime",它也会匹配。 user716736的答案更加完整。

@NielsBom危险是一个很奇怪的词语选择。另外,我的回答清楚地表明它将找到包含(请注意重点)搜索词的所有链接。而且,这个问题是许多人的欺骗并没有改变。

杜佩:当然。危险:我改写为:您可能会得到比预期更多的收益。抱歉,但我认为您的评论("如果有...日期")不明确。

相关:stackoverflow.com/questions/1604471/和stackoverflow.com/questions/1390568/

如何使用XPath通过CSS类查找元素的可能重复项?

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

我们的问题

CSS选择器:

.foo

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

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

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

正确的做法

XPath中的等效选择器是:

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

该函数对空格进行归一化处理,以去除开头和结尾的空白(并且还将空格字符序列替换为单个空格)。

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

*[class~="foo"]

它将匹配其类属性值是由空格分隔的值的列表的任何元素,其中一个值与foo完全相等。

几种明显但错误的方法

XPath选择器:

//*[@class="foo"]

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

如果在类名周围有多余的空格,它也将不匹配:

"改进的" XPath选择器

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

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

值得称赞的是我在网上发现的最早解决此问题的解决方案:

标准化空间有什么需要?

"以上答案"可能是指MrGlasss。

这可能是吗? 我的意思是,类名用制表符分隔。

我认为*[class~="foo"]错过了@。 应该是*[@class~="foo"]。

但是和$ x(// div [contains(concat("",normalize-space(@class),"")," condition")])相同

@NielsBom-如何解决最后提到的包含限制? 改用CSS选择器? 另一个答案中给出的xpath包含令牌在最新的chrome中不起作用。

@ testerjoe2您尝试了*[contains(concat("", normalize-space(@class),"")," foo")]吗?

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

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

XPath 3.1引入了一个功能contains-token,因此最终解决了这个"正式"问题。它旨在支持类。

例:

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

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

注意:从今天开始(2016-12-13),XPath 3.1的状态为候选推荐。

它不适用于当今最新的Chrome。 在起作用之前,我们如何解决// * [contains(@class," foo")]也将选择任何包含foo的类的限制,例如foobar,fooz等。

在XPath 2.0中,您可以:

//*[count(index-of(tokenize(@class, '\s+' ), 'foo')) = 1]

正如克里斯蒂安·韦斯克(Christian Weiske)所说:

https://cweiske.de/tagebuch/XPath%3A%20Select%20element%20by%20class.htm

不幸的是,截至2017年6月12日,chrome似乎尚未实现此功能。 基于en.wikipedia.org/wiki/,似乎全都缺乏

注意模板中的减号!!!如果要在DOM中查询" my-ownclass":

  • ...

  • ...

  • ...

$finder = new DomXPath($dom);

$nodes = $finder->query(".//ul[contains(@class, 'my-ownclass')]"); // This will NOT behave as expected! This will strangely match all the

elements in DOM.

$nodes = $finder->query(".//ul[contains(@class, 'ownclass')]"); // This will match the element.

HTML允许不区分大小写的元素和属性名称,然后class是用空格分隔的类名称列表。在这里,我们使用一个img标记和一个名为date的class:

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

另请参阅:CSS选择器到XPath的转换

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值