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
用于删除空白的xpath表达式_Xpath - Fatal编程技术网

用于删除空白的xpath表达式

用于删除空白的xpath表达式,xpath,Xpath,我有这个HTML: <tr class="even expanded first> <td class="score-time status"> <a href="/matches/2012/08/02/europe/uefa-cup/"> 16 : 00 </a> </td> </tr> 可以检查text()节点是否为空 /路径/文本

我有这个HTML:

 <tr class="even  expanded first>
   <td class="score-time status">
     <a href="/matches/2012/08/02/europe/uefa-cup/">

            16 : 00

     </a>
    </td>        
  </tr>
  • 可以检查text()节点是否为空

    /路径/文本()

如果这些轴没有容器,它可能对以下轴很有用:同级轴::,或者子轴::

  • 可以使用xpath 2的string()或regex()函数
注意:一些评论说xpath不能进行字符串操作。。。即使它不是专门为它设计的,您也可以做一些基本的事情:contains()、start-with()、replace()

如果您想检查空白节点,这要困难得多,因为您通常会有一个nodelist结果集,而大多数xpath函数(如match或replace)只操作一个节点

  • 您可以分离节点和字符串操作

因此,您可以使用xpath检索容器或文本节点列表,然后用另一种语言对其进行处理。(例如java、php、python、perl)。

I.使用这个XPath表达式:

translate(normalize-space(/tr/td/a), ' ', '')
translate(/tr/td/a, ' &#9;&#10;&#13', '')
说明

translate(normalize-space(/tr/td/a), ' ', '')
translate(/tr/td/a, ' &#9;&#10;&#13', '')
  • 从其参数生成一个新字符串,其中删除任何前导或尾随空格(空格、制表符、NL或CR字符),并用单个空格字符替换任何中间空格

  • 获取由
    normalize-space()
    生成的结果,并生成一个新字符串,其中剩余的每个中间空格都被空字符串替换


  • II。或者

    translate(normalize-space(/tr/td/a), ' ', '')
    
    translate(/tr/td/a, ' &#9;&#10;&#13', '')
    

    请尝试以下xpath表达式:

    //td[@class='score-time status']/a[normalize-space() = '16 : 00']
    

    我遇到这个线程时,我有我自己的问题类似于上述

    HTML

    然而,这抓住了随机空白,并给了我以下输出:

    ['\n          ', '\n        1.0.1\n      ']
    
    使用normalizespace,它删除了第一个空白节点,并留给我想要的东西

    tree.xpath('//div[@class="d-flex"]/h4/a/text()[normalize-space()]')
    
    ['\n        1.0.1\n      ']
    
    然后,我可以抓取列表的第一个元素,并使用strip()删除任何进一步的空白

    XPath最终命令

    tree.xpath('//div[@class="d-flex"]/h4/a/text()[normalize-space()]')[0].strip()
    
    这给我留下了我所需要的:

    1.0.1
    

    您可以像[normalize-space()=“16:00”]

    中那样使用XPath,使用什么实现-PHP,或者什么?XPath关注的是节点的检索,而不是字符串处理。任何删除空格的操作都需要在检索后单独完成。我认为有一个表达式可以在没有空格的情况下获得所需的文本。如果我们讨论的是php(由于它是关于html的,所以我以某种方式假设),您可以在DOMDocument对象上将preseveWhiteSpace设置为false,导致自动删除多余的空白。正如我所说,XPath不是字符串处理机制;它不能删除空格。它只涉及数据的检索。您要对该数据执行的任何操作都必须单独执行,目前我们不知道您使用的是哪种语言。@Utkanos:关于XPath的字符串处理功能的绝对语句被证明是错误的——我的回答是:)是否存在通过XML文件仅获取CDATA节点的最短XPATH表达式?@ArupRakshit,XPATH数据模型中没有“CDATA节点”,因此无法将CDATA作为包含它的文本节点的一部分进行区分。与不可能知道短标记是否用于没有子元素的元素,或者是否在属性值周围使用引号或撇号作为分隔符相同。@DimitreNovatchev感谢您的回答。这意味着,我需要找到它,我搜索常规节点。@ArupRakshit,是的,在XPath中只能选择全文节点。如果您对要查找的文本了解更多(如子字符串),则可以使用谓词筛选这些节点