2

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

这里是我的背景页:

<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> 

回答

3

您不能在普通字符串上使用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元素,对应选择。

+0

不要使用'querySelectorAll',但是'querySelector'。 ID必须是唯一的,所以你可以确定选择只返回一个元素。 'querySelector'比XPath更快[http://jsperf.com/getelementbyid-vs-queryselector/5],所以这个答案包含了一个很好的建议。尽管如此,这种方法无法使用纯字符串,请参阅我对该部分的回答。 – 2012-02-25 18:46:08

+0

Rob是正确的,如果这几行有一个属性,可以定义选择它们,你最好使用querySelectorAll这样的属性。那么您将立即获得这些元素的列表。 – 2012-02-25 18:56:34