из моего предыдущего вопроса,
как ведет себя этот xpath?
Я обнаружил, что
html//p//table//tr//td/a
может справиться с любыми неожиданными элементамикоторые отображаются между указанным выше xpath.
Например, описанный выше xpath может обрабатывать:
html/p/div/table/tr/td/a
html/p/table/tr/td/b/div/a
Однако как я могу сформулировать xpath, который будет полностью устойчив к отсутствующим / неожиданным элементам?
Например, упомянутый в начале xpath не может обрабатывать следующее:
/html/table/tr/td/a (p is missing)
/html/div/span/table/tr/td/a (p is missing and position replaced with `div/span/`)
Существует ли синтаксис xpath для решения приведенного выше случая?Если нет, то какой будет альтернативный подход?
Моя интуиция говорит мне, что это невозможно с одним xpath, поэтому я использую следующий алгоритм с использованием псевдокода.
По сути, это будетразделите данный xpath и найдите ближайшего потомка для каждого предка.Если ожидаемый дочерний элемент не существует или является каким-либо другим элементом, он перебирает всех дочерних элементов текущего предка и пытается найти ожидаемого дочернего элемента.
function searchElement(){
elements[] = "/html/p/table/tr/td/a".split("/");
thisElement = "";
for (element in elements) {
if (firstItem){
thisElement = findElementByXpath(element);
}else{
try{
thisElement.findElementByXpath(element); //look for this element inside previous element (from previous iteration);
}catch(NotFoundException e){ //if element is not found, search all elements inside previous element, and look for it.
foundElement = false;
discoveredElement = thisElement.findElementByXpath("*");
while(foundElement != true){
if (discoveredElement.findEleemntByXpath(element) != null){
//successful, element found, overwrite.
thisElement = thisElement.findElementByXpath("*").findEleemntByXpath(element);
foundElement = true;
}else{
//not successful, keep digging.
discoveredElement = discoveredElement.findElementByXpath("*");
}
}
}
}
}
return thisElement;
}
Это оптимальный подход?Меня беспокоит, что поиск "*" и копание в каждом элементе довольно неэффективны.
Я не знаю, что пометить этим вопросом, кроме "xpath" ... не стесняйтесь редактировать.
Спасибо.