Возможно, есть лучший способ сделать это, чем то, что я делаю, потому что Я застрял в метафорической выбоине.Как я могу 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, которая защищала фильтр «Не-включают- или-я любой-потомок», который я думаю, что будет делать именно то, что я хочу, но это похоже, не попал в итоговую спецификацию . :(
Я действительно не хотел так поступать, но вы говорили мне об этом. Теперь мне нужно выяснить, как удалить элементы, которые я не хочу (например, все элементы ''), независимо от того, насколько глубоко они вложены. – samwyse
@samwyse, если вы хотите иметь возможность _remove_, возможно, реализация XQuery с расширениями XQUF (XQuery Update Facility) будет правильным инструментом. –