Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Html XPath表达式问题_Html_Xpath - Fatal编程技术网

Html XPath表达式问题

Html XPath表达式问题,html,xpath,Html,Xpath,我有以下HTML代码段,,我想提取一个标签,该标签有一个text()子体,其值为“172.80”(这是该代码段的第四个节点)。到目前为止,我的努力是: 'descendant::td[@class="roomPrice figure" and contains(descendant::text(), "172.80")]' 'descendant::td[@class="roomPrice figure" and contains(div/text(), "172.80")]' 'descend

我有以下HTML代码段,,我想提取一个标签,该标签有一个text()子体,其值为“172.80”(这是该代码段的第四个节点)。到目前为止,我的努力是:

'descendant::td[@class="roomPrice figure" and contains(descendant::text(), "172.80")]'
'descendant::td[@class="roomPrice figure" and contains(div/text(), "172.80")]'
'descendant::td[@class="roomPrice figure" and div[contains(text(), "172.80")]]'
但他们都没有选择任何东西。
有人有什么建议吗?

当将节点集传递给函数调用时,请注意,如果函数签名没有声明节点集参数,那么它将从该节点集中强制转换第一个节点

所以,我认为您需要这个XPath表达式:

descendant::td[@class="roomPrice figure"][div[text()[contains(.,'172.80')]]]
测试
div

测试
div


测试
td

的文本节点后代,我相信您希望这样:

<xsl:for-each select="//td[contains(string(.), '172.80')]">

string()函数将为您提供当前和子节点中的所有文本,而se text()只提供当前(上下文)节点中的文本

当然,您还可以扩展xpath选择器来过滤类名

<xsl:for-each select="//td[contains(string(.), '172.80')][@class='roomPrice figure']">


正如上面的评论所述,您发布的xml/html目前是无效的。

我的理解是,您希望在指定类中选择
td
元素,该元素有一个包含值“172.80”的后代文本节点

我假设上下文节点是
(或者它的某个祖先)

您列出的所有尝试都会遇到以下问题:
contains()
仅使用节点集的第一个节点将其第一个参数转换为单个字符串。因此,如果
td
div
在包含“172.80”的文本节点之前有一个子文本节点,则不会注意到包含“172.80”的文本节点

试试这个:

'descendant::td[@class="roomPrice figure" and
                descendant::text()[contains(., "172.80")]]'

HTML代码段不是有效的XML/HTML-存在以
开头的
title
属性,请修复您的代码。我得到一个错误:“错误:引用未声明的实体‘nbsp’”,您使用什么来应用这些XPath查询?jQuery?硒?这很重要。我正在用Scrapy进行抓取,并使用Scrapy的选择器进行HTML解析。选择器基于libxml2。下面是相关页面的URL,因此您可以直接尝试XPath表达式。是的,我还注意到HTML是无效的,尽管它在控制台中看起来是有效的。re:validity,@Oded的意思是它不是格式良好的XML。(“Valid”指符合模式,这在这里不相关。)然而,将XPath应用于HTML的工具,如Scrapy和Selenium,使用HTML的DOM树表示,因此他们不太关心它是否是格式良好的XML。这是一种方法。请注意,显式
字符串(.)
是多余的,因为第一个参数将隐式转换为字符串。唯一的缺点是,每个td都可以通过这种方式转换为字符串,这将涉及大量不必要的字符串连接来构建将被丢弃的字符串。但对于小型网页来说,这可能不是问题。@LucianU:不客气。你可能应该对你认为有用的答案投赞成票,然后接受其中一个。拉尔斯,我试过投反对票,但我没有足够的声誉。顺便说一句,谢谢你清楚地解释了这个问题。我现在明白错在哪里了,希望不会重蹈覆辙。@LucianU:好的,没问题。理解XPath的哪些部分支持“常规(节点集)比较”,哪些部分不支持,这是一件棘手的事情。
<xsl:for-each select="//td[contains(string(.), '172.80')][@class='roomPrice figure']">
'descendant::td[@class="roomPrice figure" and
                descendant::text()[contains(., "172.80")]]'