2012-05-09 5 views
1

Возможно, есть лучший способ сделать это, чем то, что я делаю, потому что Я застрял в метафорической выбоине.Как я могу XPath игнорировать вложенные узлы?

Я хочу получить некоторые узлы под определенным узлом. Я придумал с этим выражением XPath:

>>> content_tags = 'h1 h2 h3 h4 h5 h6 p ol ul dl table'.split() 
>>> content_xpath = './/*[%s]' % ' or '.join('self::%s' % i for i in content_tags) 
>>> content_xpath 
'.//*[self::h1 or self::h2 or self::h3 or self::h4 or self::h5 or 
self::h6 or self::p or self::ol or self::ul or self::dl or 
self::table]' 

Любой из перечисленных content_tags может быть в верхней части иерархии я хотел, и я хочу, чтобы игнорировать другие элементы, которые могут быть в то же или выше уровни. К сожалению, иногда есть <p> внутри <ul> или <table> или <table> внутри <ol> и т. Д., И я получаю внутренний элемент как отдельный результат вместе с внешним. Есть ли хороший способ для выполнить «вырезать», чтобы игнорировать узлы, которые могут быть вложены внутри одного, что Я нашел? Или есть какой-то лучший способ сделать это, что я как-то не хватает?

Вот пример того, что я пытаюсь разобрать.

<div class="interesting"> 
<img src="ignore-this.jpg"/> 
<h1>I want this.</h1> 
<p>I want this, too.</p> 
<div class="sidebar"> 
<ul> 
<li><p>I only want one copy of this, inside the UL.</p></li> 
<li><p>Ditto.</p></li> 
</ul> 
</div> 
</div> 

Спасибо!

BTW, я нашел несколько сообщений о списке рассылки w3.org, которая защищала фильтр «Не-включают- или-я любой-потомок», который я думаю, что будет делать именно то, что я хочу, но это похоже, не попал в итоговую спецификацию . :(

ответ

0

Поиск и с //p явно рекурсивной - если это не то, что вы хотите, не делайте этого :)

Если вы хотите только p, что непосредственно под интересным div, но div! может быть где угодно в вашей иерархии, это будет выражаться как таковой:

//div[@class='interesting']/p 

... если вы хотите только p, что непосредственно под расположение в дереве поиска является относительно, это еще проще:

./p 
+0

Я действительно не хотел так поступать, но вы говорили мне об этом. Теперь мне нужно выяснить, как удалить элементы, которые я не хочу (например, все элементы ''), независимо от того, насколько глубоко они вложены. – samwyse

+0

@samwyse, если вы хотите иметь возможность _remove_, возможно, реализация XQuery с расширениями XQUF (XQuery Update Facility) будет правильным инструментом. –

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