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