2

Я пытаюсь извлечь несколько строк из таблицы с этой страницы http://www.money.pl/pieniadze/ используя выражение xpath и javascript. Я могу получить всю страницу, отображаемую как всплывающее окно, но я не могу вычислять выражение xpath с помощью document.evaluate(); Пробовал играть с XPathResultType, но результатов не найдено. Может ли кто-нибудь помочь?Оценка выражения xpath в Chrome

Вот мой фон страница:

<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'. Идентификаторы должны быть уникальными, поэтому вы можете быть уверены, что выбор возвращает только один элемент. 'querySelector' намного [быстрее] (http://jsperf.com/getelementbyid-vs-queryselector/5), чем XPath, поэтому этот ответ содержит хороший совет. Тем не менее, этот метод не может работать с обычными строками, см. Мой ответ для этой части. –

+0

Роб прав, если эти несколько строк имеют свойство, которое может определенно выбрать их, вам лучше использовать querySelectorAll с такими свойствами. то вы сразу получите список таких элементов. –