Нужно составить xPath, в зависимости от содержимого родительских узлов, как?

Ссылка скопирована
31 января 2026 1 ответ

Вот код

<div> 	<div> 		<div>Аркадий<div> 		 		<div> 			<h2>ЗП</h2> 			<div>100 000</div> 			<div>+ 50 000</div> <!-- (искомый div) --> 			<div>+ 10 000</div> 		</div> 	</div>  	<div> 		<div>Анатолий<div> 		 		<div> 			<h2>ЗП</h2> 			<div>100 000</div> 			<div>+ 50 000</div> 			<div>+ 10 000</div> 		</div> 	</div> 	 	<div> 		<div>Василий<div> 		 		<div> 			<h2>ЗП</h2> 			<div>100 000</div> 			<div>+ 50 000</div> 			<div>+ 10 000</div> 		</div> 	</div>  </div>

<div> <div> <div>Аркадий<div> <div> <h2>ЗП</h2> <div>100 000</div> <div>+ 50 000</div> <!-- (искомый div) --> <div>+ 10 000</div> </div> </div> <div> <div>Анатолий<div> <div> <h2>ЗП</h2> <div>100 000</div> <div>+ 50 000</div> <div>+ 10 000</div> </div> </div> <div> <div>Василий<div> <div> <h2>ЗП</h2> <div>100 000</div> <div>+ 50 000</div> <div>+ 10 000</div> </div> </div> </div>

Мне нужно с помощью xPath найти этот тег
<div>+ 50 000</div>
именно в блоке Аркадия. Проблема в том, что во всех блоках это содержимое (+ 50 000) одинаково, но мне его надо найти именно в блоке с именем Аркадий

Очень прошу помощи, спасибо =)

Дополнительно:

//div[contains(text(),'Аркадий')]/following-sibling::div//div[contains(text(),'+ 50 000')]

//div[contains(text(),'Аркадий')]/following-sibling::div//div[contains(text(),'+ 50 000')]

  • Спасибо!
    но вот тут сделал тест - https://codebeautify.org/Xpath-Tester
    и он совпадений не нашёл

    Нужно составить xPath, в зависимости от содержимого родительских узлов, как?

  • Matsun, проверяйте там, где будете исполнять свой xpath (php, python, etc..). Тестеры эти онлайн через один работают. Например, вот тут https://xpath.curiousconcept.com/ всё работает без проблем.
  • Понял, спасибО!
  • Извините за надоедливость =) но как изменится xPath, если в вёрстку добавится h1:
    &lt;div&gt; 	&lt;div&gt; 		&lt;h1&gt;Аркадий&lt;/h1&gt; 	&lt;/div&gt; 	 	&lt;div&gt; 		&lt;h2&gt;ЗП&lt;/h2&gt; 		&lt;div&gt;100 000&lt;/div&gt; 		&lt;div&gt;+ 50 000&lt;/div&gt; &lt;!-- (искомый div) --&gt; 		&lt;div&gt;+ 10 000&lt;/div&gt; 	&lt;/div&gt; &lt;/div&gt;

    &lt;div&gt; &lt;div&gt; &lt;h1&gt;Аркадий&lt;/h1&gt; &lt;/div&gt; &lt;div&gt; &lt;h2&gt;ЗП&lt;/h2&gt; &lt;div&gt;100 000&lt;/div&gt; &lt;div&gt;+ 50 000&lt;/div&gt; &lt;!-- (искомый div) --&gt; &lt;div&gt;+ 10 000&lt;/div&gt; &lt;/div&gt; &lt;/div&gt;

  • Matsun, вот так можно
    //div[h1[contains(text(),'Аркадий')]]/following-sibling::div//div[contains(text(),'+ 50 000')]

    //div[h1[contains(text(),'Аркадий')]]/following-sibling::div//div[contains(text(),'+ 50 000')]

Нужно решить такую задачу?

Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

Заказать помощь
Лучший ответ
1
Максим Павлов Ответ

Для составления XPath выражения, зависящего от содержимого родительских узлов, можно использовать различные особенности XPath, такие как функции, операторы и условия. Вот несколько примеров:

1. Использование функции `parent::node()` для обращения к родительскому узлу:

//div[@class='parent']/parent::node()/child::span

//div[@class='parent']/parent::node()/child::span

2. Использование условия `contains()` для проверки содержимого родительского узла:

//div[contains(@class, 'parent')]/child::span

//div[contains(@class, 'parent')]/child::span

3. Использование оператора `and` для комбинирования условий:

//div[@class='parent' and contains(text(), 'content')]/child::span

//div[@class='parent' and contains(text(), 'content')]/child::span

4. Использование переменных для хранения содержимого родительского узла и последующего обращения к ним:

$x = "content";
//div[@class='parent' and contains(text(), $x)]/child::span

$x = "content"; //div[@class='parent' and contains(text(), $x)]/child::span

Это лишь некоторые примеры того, как можно составлять XPath выражения, зависящие от содержимого родительских узлов. В зависимости от конкретной структуры и содержания HTML документа, вам может потребоваться экспериментировать с различными методами и комбинациями, чтобы добиться нужного результата. Надеюсь, это поможет вам решить вашу проблему!

Другие ответы (0)

Пока нет других ответов. Будьте первым, кто поможет автору.

Ответить на вопрос

комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Вам также может быть интересно