2013-04-15 3 views
5

Пытается написать функцию в node.js, которая получит элемент по xpath.Получение элемента с использованием xpath и cheerio

У меня есть XPath требуемого элемента йота как

xpath = '/html/body/div/div[2]/div/h1/span' 

Мой DOM загружен в Cheerio через фс модуль (потому что я этот веб-страницы хранятся локально):

var file = fs.readFileSync("aaa.html") 
var inDom = cheerio.load(file) 

Тогда Я пытаюсь выполнить итерацию через каждую часть xpath, получить элемент дерева дерева, проверить его дочерние элементы, если имя и номер элемента совпадают, и если они это сделают, сохраните rez, так как этот элемент т. Затем я продолжаю копать новую часть xpath. Код выглядит так, но он не может получить то, что я хочу, потому что сразу после того, как я получу первый маш и установил rez в качестве согласованного элемента, в следующем цикле цикла этот новый элемент, похоже, не имеет каких-либо дочерних элементов.

var rez = inDom('html'); 
var xpath = inXpath.split("/"); 
for(var i = iterateStart; i < xpath.length; i++) { 
    var selector = xpath[ i ].split('[')[0]; 
    var matches = xpath[ i ].match(/\[(.*?)\]/); 
    var child = 0; 
    if(matches) { 
     child = matches[ 1 ]; 
    } 

    for(var k = 0; k < rez.length; k++) { 
     var found = false 
     var curE = rez[ k ] 

     for(var p = 0; p < curE.children.length; p++) { 
      var curE_child = curE.children[ p ] 

      if(curE_child.name = selector) { 
       if(child > 0) { 
        child-- 
       } 
       else { 
        rez = curE_child 
        found = true 
        break 
       } 
      }    
     } 
     if(found) { 
      break 
     } 
    }  
} 

Может ли кто-нибудь помочь мне с кодом, используя указанные модули node.js?

ответ

4

Кажется, что вы делаете больше работы, тогда вам нужно найти нужный элемент. Можете ли вы опубликовать образец html-страницы?

Cheerio предлагает api более высокого уровня для поиска элементов, которые вы должны использовать.

var html = fs.readFileSync('aaa.html') 
var $ = cheerio.load(html) 
var selector = 'div' // some selector here which I can tune to the example html page 
var parent = $(selector) 
var childSelector = 'p' // some other selector 
var children = parent.find(childSelector) 
+0

я реализовать свой подход, и я застрял на том, чтобы, например, , третий элемент, когда часть xpath похожа на «../ div [3]/...». Я использую код, вставленный здесь http://pastebin.com/pzSYz6Zc Ошибка также вставлена. – Astro

+0

Без какого-либо образца html трудно дать вам предложения. Пожалуйста, напишите пример html-страницы – Noah

+0

, там нет html-страницы, это часть кода node.js – Astro

0

Я написал этот код, который получает правильный элемент в cheerio, Дано xpath.

Это работает только для базового xpath, такого, что упоминается в вопросе и типа, который обычно задается браузерами для элемента.

inXpath = "BODY/DIV[1]/DIV[2]/DIV[1]/DIV[1]/DIV[3]/DIV[1]/DIV[1]/DIV[3]/DIV[3]/DIV[1]/DIV[1]/DIV[1]/DIV[1]/SPAN[1]" 
var xpath = inXpath.split("/"); 
var dom_body = cheerio.load(body); 
sss = dom_body('*'); 
for(var i = 0; i < xpath.length; i++) { 
    if (xpath[i].indexOf('[') == -1){ 
     sss = sss.children(xpath[i]) 
    } else { 
     var selector = xpath[i].split('[')[0]; 
     var matches = xpath[i].match(/\[(.*?)\]/); 
     var index = matches[1] - 1; 
     sss = sss.children(selector).eq(index) 
    } 
} 
console.log(sss.html().trim()) 
+0

Однако это не похоже на реализацию XPath, совместимую с W3C. –

0

Да есть реализация XPath:

npm install xpath 

Пример:

var xml = "<book><title>Harry Potter</title></book>" 
var doc = new dom().parseFromString(xml) 
var title = xpath.select("//title/text()", doc).toString() 
console.log(title) 

Источник: https://www.npmjs.org/package/xpath

+1

К сожалению, парсер DOM, используемый в примере (xmldom), очень строгий и не работает с реальными страницами HTML. В то время я еще не нашел прощающего парсера DOM, совместимого с xpath. –

Смежные вопросы