1

免责声明:我知道用正则表达式解析 HTML 不是正确的方法。我实际上只是想解析 HTML 中的文本。

我正在解析几页,我正在寻找价格。这是我到目前为止所拥有的:

var all = document.body.querySelectorAll(":not(script)");
var regex = /\$[0-9,]+(\.[0-9]{2})?/g;

for (var i = 0; i < all.length; i++) {

    var node_value = all[i].nodeValue;
        for (var j = 0; j < all[i].childNodes.length; j++) {

            var node_value = all[i].childNodes[j].nodeValue;
            if (node_value !== null) {

                var matches = node_value.match(regex);
                if (matches !== null && matches.length > 0) {

                    alert("that's a match");
                }
            }
        }
}

这个特定的代码可以让我得到这样的价格:

<div>This is the current price: <span class="current">$60.00</span></div>

但是,有些价格具有以下结构:

<div>This is the current price: <sup>$</sup><span>80.00</span></div>

我如何改进算法以找到这些价格?我应该用正则表达式查看第一个 for 循环<sup>symbol</sup><span>price</span>吗?

重要提示:一旦匹配,我需要找出哪个 DOM 元素持有该价格。持有价格的最内在因素。例如:

<div><span>$80.00</span></div>

我需要说的是持有价格的元素,而不是 div。

4

2 回答 2

1

尝试这个:

var text = document.body.textContent || document.body.innerText,
    regex = /\$\s*[0-9,]+(?:\s*\.\s*\d{2})?/g,
    match = text.match(regex);
if( match) {
    match = match[0].replace(/\s/g,"");
    alert("Match found: "+match);
}

使用递归搜索:

function findPrice(node) {
    node = node || document.body;
    var text = node.textContent || node.innerText,
        regex = /\$\s*[0-9,]+(?:\s*\.\s*\d{2})?/,
        match = text.match(regex);
    if( match) {
        var children = node.children, l = children.length, i;
        for( i=0; i<l; i++) {
            if( findPrice(children[i])) {
                return children[i];
            }
        }
        // if no children matched, then this is the narrowest container
        return node;
    }
    else return false;
}
var result = findPrice();
于 2013-10-30T22:33:26.140 回答
0

如果您可以选择您的浏览器,您可以使用 XPath 来预先选择您的候选人。以下代码查找候选节点。我在 Firefox 25 中尝试过。您可能还想查看哪些浏览器支持 Xpath 2.0?http://www.yaldex.com/ajax-tutorial-4/BBL0029.html用于跨浏览器方法。

<html><head><script type="text/javascript">
function func() {
  //span containing digits preceeded by superscript dollar sign
  var xpathExpr1 = "//span[translate(text(),'0123456789.,','')!=text()][preceding-sibling::sup[text()='$']]";
  //span containing digits and starting with dollar sign
  var xpathExpr2 = "//span[translate(text(),'0123456789.,','')!=text() and contains(text(),'$')]";
  var xpathExpr3 = xpathExpr1 + "|" + xpathExpr2; // union
  var contextNode = document.body;
  var namespaceResolver = function(prefix){return "";}
  var resultType = XPathResult.UNORDERED_NODE_ITERATOR_TYPE;
  var xpathResult = document.evaluate(xpathExpr1, contextNode, namespaceResolver, resultType, null);
  alert(xpathResult);
  var node;
  while ((node = xpathResult.iterateNext()) != null) {
      alert(node.textContent);
  }
}
</script></head>
<body onload="func()"> aaa
<sup>$</sup><span>80.00</span> bbb
<span>$129</span> ccc
<sup>$</sup><span>ABC</span> ddd
</body></html>
于 2013-10-30T23:58:47.340 回答