【问题标题】:Evaluating xpath expression in Chrome在 Chrome 中评估 xpath 表达式
【发布时间】:2012-02-25 18:23:33
【问题描述】:

我正在尝试从此页面http://www.money.pl/pieniadze/ 的表中提取几行 使用 xpath 表达式和 javascript。 我可以将整个页面显示为弹出窗口,但我无法使用 document.evaluate() 评估 xpath 表达式; 尝试使用 XPathResultType 但没有结果。 有人可以帮忙吗?

这是我的背景页面:

<html><head><script>
...
var wholePage;
setInterval(fetch, 20000);


    function fetch()
    {
        req = new XMLHttpRequest();
        var url = "http://www.money.pl/pieniadze/";
        req.open("GET", url);
        req.onload = process;
        req.send();
    }   

    function process()
    {
        wholePage = req.responseText;
    }
</script></head></html>

这是弹出页面:

<html><head><script>
...
    onload = setTimeout(extract, 0); 

        function extract()  
        {
            chrome.browserAction.setBadgeText({text: ''});
            var bg = chrome.extension.getBackgroundPage();
            var EurPlnPath = "//tr[@id='tabr_eurpln']";
            var tempDiv = document.getElementById('current');
            tempDiv.innerHTML = bg.wholePage;
            var oneTopic = document.evaluate( EurPlnPath, bg.wholePage, null, XPathResult.ANY_TYPE, null)
            var res = oneTopic.iterateNext();
        }

</script></head>
<body>
<div id="current">
</div>
</body>
</html>

【问题讨论】:

    标签: javascript google-chrome xpath google-chrome-extension document.evaluate


    【解决方案1】:

    您不能在纯字符串上使用 XPath。您必须先将字符串转换为文档。例如,使用DOMParser。当前浏览器尚不支持text/html。要使其工作,您必须包含指定的代码at this answer:

    var bgWholePage = new DOMParser().parseFromString(bg.wholePage, 'text/html');
    document.evaluate( EurPlnPath, bgWholePage, ...
    

    如果要在后台页面解析文档,请使用bg.document.evaluate而不是document.evaluate:

    var oneTopic = bg.document.evaluate( EurPlnPath, bg.wholePage, null, XPathResult.ANY_TYPE, null)
    

    【讨论】:

      【解决方案2】:

      尝试document.querySelector("tr#tabr_eurpln") 代替document.evaluate,这将返回一个DOM 元素,对应于选择器。

      【讨论】:

      • 不要使用querySelectorAll,而是使用querySelector。 ID 必须是唯一的,因此您可以确保选择只返回一个元素。 querySelector 比 XPath 多 faster,所以这个答案包含一个很好的建议。不过,这种方法不能使用纯字符串,请参阅我对那部分的回答。
      • Rob 是对的,如果这几行有一个属性,可以明确选择它们,你最好使用 querySelectorAll 和这样的属性。那么您将立即获得此类元素的列表。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-23
      • 1970-01-01
      • 1970-01-01
      • 2019-04-08
      • 1970-01-01
      相关资源
      最近更新 更多