2013-02-19 4 views
2

Я очищаю html-документ, структура которого меняется все время. Имена классов Css даже меняются, поэтому я не могу положиться на это. Тем не менее, одна вещь никогда не изменяется, то значение всегда содержится в поддереве точно так:XPath искать поддерево

<span> 
    <span> 
    <span>wanted value</span> 
    <span></span>wanted value 
    </span> 
</span> 

Может ли это быть выражено как выражение XPath?

Он должен не матч:

<span> 
    <span> 
    <span> 1, one too little </span> 
    <span> 2 </span> 
    <span> 3, one too many </span> 
    <span> 4, two too many </span> 
    </span> 
</span> 

Я планирую сделать это с помощью LXML для Python.

ответ

3

Если местонахождение разыскиваемого значения всегда находится на третьем уровне шкалы XPath следующим образом будет работать:

//span/span/span[1] 

При нанесении на следующий HTML-документ:

<html> 
    <head> 
    <title>Your Title</title> 
    </head> 
    <body> 
    <div> 
    <span> 
     <span> 
     <span>wanted value</span> 
     <span></span> 
     </span> 
    </span> 
    </div> 
    <div> 
    <span> 
     <span> 
     <span>wanted value</span> 
     <span></span> 
     </span> 
    </span> 
    </div> 
    </body> 
</html> 

Результат будет:

wanted value 
wanted value 

EDIT

Если вы хотите только значения первого пролета на третьем уровне, когда сумма пролетов равна 2 на третьем уровне вы можете использовать следующие XPath:

//span/span[count(span) = 2]/span[1] 
+0

Ваше выражение будет также соответствовать где существует более двух самых внутренних элементов span, например, четырех родственников, я бы хотел, чтобы он соответствовал только тогда, когда их было два. –

+0

@ThomasWessel: Я не совсем понимаю, что вы имеете в виду. Можете ли вы расширить/изменить свой вопрос или попытаться объяснить с помощью примеров документов HTML и желаемого вывода? –

+0

Обновлено с помощью контрпримера –

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