在 import.io XPath 选择器中用单斜杠替换双斜杠

Replace double slash with single slash in import.io XPath selector

我正在使用 import.io 抓取一些页面。我遇到了一个使用内部 href 的页面,如下所示:http://domain.com//Event - 注意域名后的双斜杠。根据我的研究,这是为了 SEO 目的而完成的,但我需要得到没有双斜杠的 url,所以它 returns http://domain.com/Event.

我正在尝试使用 XPath(我对它很陌生),我可以使用 link 得到 //a[contains(@class, 'event-info-btn')]//@href

我的下一步是尝试 fn:repace() 使用此:fn:replace(//a[contains(@class, 'event-info-btn')]//@href, 'http://domain.com//', 'http://domain.com/')。这不起作用 - 没有返回任何内容。

我不确定是我的实现不好,还是 import.io 不支持这个。

注意 import.io claims 支持 XPath 2.0。

问题

您可能是指 /@href 而不是 //@href,但这不是真正的问题。

您的 XPath 是 returning 一系列 href 属性,其中 replace() 需要一个字符串。

解决方案

为此HTML,

<div>
  <a class="event-info-btn" href="http://domain.com//1">one</a>
  <a class="event-info-btn" href="http://domain.com//2">one</a>
  <a class="event-info-btn" href="http://domain.com//3">one</a>
</div>

这个 XPath,

for $href in //a[contains(@class, 'event-info-btn')]/@href 
    return replace($href, 'http://domain.com//', 'http://domain.com/')

将return

http://domain.com/1
http://domain.com/2
http://domain.com/3

根据要求。


更新

This doesn't work in import.io and I'm having trouble finding a fiddle-like site to test it.

你可以看到这个工作 here.

Import.io, it seems, only allows you to input one line of xpath.

您可以尝试将 XPath 放在一行中,然后:

for $href in //a[contains(@class, 'event-info-btn')]/@href return replace($href, 'http://domain.com//', 'http://domain.com/')

如果这不起作用,则 import.io's claim that they support XPath 2.0 不正确。