在上一个 <td> 之后获取 <td> 的内部 HTML

Getting inner HTML of a <td> after previous <td>

所以,我在可能对用户最不友好的 CRM 中工作,我想通过 iMacros 让我的生活更轻松一些。

然而,事情太复杂了,我不能做一个简单的任务来轻松获得一些价值。

页面上的内容如下所示:

<td id="_t5141276" class="Label">Number:</td>
<td id="_t5141277" class="Value">1234567890</td>

我需要获取 "Value" class 的 innerhtml,但是:
1) 页面上有一堆值
2) 每页随机生成ID。

我发现我可以在第一个 td 中查找 "Number:" 文本,然后在那个之后获取 td 的 innerhtml,但我该怎么做?

我希望它位于 javascript 或其他我可以轻松集成到 iMacros 中的东西。

我假设您不能以任何方式更改标记,因为您的问题中似乎暗示了这一点。

您可以从 querySelectorAll 获取按文档顺序排列的所有 td 元素的列表。当你找到其中有 Number: 的那个时,就使用下一个:

var list = document.querySelectorAll("td"); // See note below
var index;
var value;
for (index = 0; index < list.length - 1; ++index) {
    if (list[index].innerHTML === "Number:") {
        value = list[index + 1].innerHTML;
        break;
    }
}

请注意,我已经考虑到 Number: 项可能是最后一项(因此我们想要的下一项可能会丢失),方法是在最后一项中停止一项。


注意:以上是以正常方式在网页中进行的。要在 iMacros 中执行此操作,显然您必须将 window.content 添加到 document.querySelectorAll 之前,因此第一行将是:

var list = window.content.document.querySelectorAll("td");
//         ^^^^^^^^^^^^^^^------- added for iMacros

首先,您可以获取所有 td 元素并检查 tdinnerHTML 并与您的 "Number:" 匹配。如果它被加工,则获取下一个 td 值。

代码将是这样的:

var value = 0; 
var tds = document.getElementsByTagName("td");
for (var i=0; i< tds.length; i++)
{
    var currentTd = tds[i];
    var value = currentTd.innerHTML.trim() // trim will remove extra spaces
    if(value === "Number:")
    {
        value = tds[i+1].innerHTML;
        break;
    }
}

感谢您的回答。我不能给他们投票,因为我没有足够的代表,但所有建议都有效(包括经过一些调整后为 iMacros 删除的建议)。

非JavaScript选项

Adobe CQ5 也喜欢随机生成 ID。

我通常做的是在 chrome 中打开有问题的页面,检查我要隔离的元素,然后在检查工具中删除 "ID" 的值,直到我删除了所有动态生成的元素,这些元素是相关元素的父元素。

完成后,再次检查您的元素(您要避免刷新和删除您所有的辛勤工作!)并右键单击 html 元素以复制 XPATH。

这需要反复试验,并且经常需要我多次复制 XPATH 才能找到偷偷摸摸的 ID。

在 iMacros 中,使用

TAG XPATH="[your XPATH goes here]" EXTRACT=TXT
TAG XPATH="[your XPATH goes here]" CONTENT=whatever

随心所欲