65

我有这个 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>

我想在没有额外空格的情况下提取 (16 : 00) 字符串。这可能吗?

4

5 回答 5

142

I. 使用这个单一的 XPath 表达式

translate(normalize-space(/tr/td/a), ' ', '')

说明

  1. normalize-space()从其参数生成一个新字符串,其中删除任何前导或尾随空格(空格、制表符、NL 或 CR 字符),并将任何中间空格替换为单个空格字符。

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


二、或者

translate(/tr/td/a, ' &#9;&#10;&#13', '')
于 2012-08-02T12:39:43.100 回答
28

请尝试以下 xpath 表达式:

//td[@class='score-time status']/a[normalize-space() = '16 : 00']
于 2016-08-22T09:23:08.563 回答
7

您可以使用 XPath 的normalize-space(),如//a[normalize-space()="16 : 00"]

于 2020-01-08T05:48:00.067 回答
2

当我遇到与上述类似的问题时,我遇到了这个线程。

HTML

<div class="d-flex">
<h4 class="flex-auto min-width-0 pr-2 pb-1 commit-title">
  <a href="/nsomar/OAStackView/releases/tag/1.0.1">

    1.0.1
  </a>

XPath 启动命令

tree.xpath('//div[@class="d-flex"]/h4/a/text()')

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

['\n          ', '\n        1.0.1\n      ']

使用 normalize-space,它删除了第一个空白节点并给我留下了我想要的东西

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
于 2019-07-08T14:58:33.840 回答
1
  • 您可以检查 text() 节点是否为空。

    /path/text()[不是(.='')]

如果没有容器,它可能对像 follow-sibling:: 这样的轴有用,或者对 child:: 有用。

  • 您可以使用 xpath 2 的 string() 或 regex() 函数。

注意:一些评论说 xpath 不能进行字符串操作......即使它不是真的设计用于你可以做一些基本的事情:包含(),开始(),替换()。

如果你想检查空白节点,那就更难了,因为你通常会有一个节点列表结果集,而且大多数 xpath 函数,比如匹配或替换,只操作一个节点。

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

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

于 2012-08-02T12:21:07.233 回答