XPATH возвращает содержимое элемента html на основе имени в элементе выше - PullRequest
0 голосов
/ 28 января 2020
<div class="vdatatable">
  <div class="rowh">Emissions
  </div>
  <a name="anc0"></a>
  <div class="optexrow oid0 row " data-oid="0">
    <div class="key">CO2 Emissions
    </div>
    <div class="value">117 g/km 
    </div>
    <div class="cf">
    </div>
  </div>
  <a name="anc0"></a>
  <div class="optexrow oid0 row1 " data-oid="0">
    <div class="key">Standard Euro Emissions
    </div>
    <div class="value">EURO6 
    </div>
    <div class="cf">
    </div>
  </div>
  <div class="rowh">Engine and Drive Train
  </div>
  <a name="anc0"></a>
  <div class="optexrow oid0 row " data-oid="0">
    <div class="key">Engine Size
    </div>
    <div class="value">998 cc 
    </div>
    <div class="cf">
    </div>
  </div>
  <a name="anc0"></a>
  <div class="optexrow oid0 row1 " data-oid="0">
    <div class="key">Gears
    </div>
    <div class="value">5 
    </div>
    <div class="cf">
    </div>
  </div>
  <a name="anc0"></a>
  <div class="optexrow oid0 row " data-oid="0">
    <div class="key">Number of Valves
    </div>
    <div class="value">12 
    </div>
    <div class="cf">
    </div>
  </div>
  <a name="anc0"></a>
  <div class="optexrow oid0 row1 " data-oid="0">
    <div class="key">Transmission
    </div>
    <div class="value">Manual 
    </div>
    <div class="cf">
    </div>
  </div>
  <div class="rowh">Fuel Consumption
  </div>
  <a name="anc0"></a>
  <div class="optexrow oid0 row " data-oid="0">
    <div class="key">EC Combined 
    </div>
    <div class="value">50.4 mpg 
    </div>
    <div class="cf">
    </div>
  </div>
</div>

Я хочу вернуть данные в классе div "rowh". Но на основании названия «Выбросы». Мне нужны только эти данные, а не данные следующего деления, которые имеют точно такой же класс, но имеют имя «Двигатель и Привод». Я пробовал много вариантов:

//div[contains(@class, 'optexrow')]/div[@class='key']/ancestor::div[starts-with(., 'Emissions')]

//div[contains(@class, 'rowh') and contains(., 'Emissions')]/div[@class=key]

//div[preceding-sibling::div[starts-with(., 'Emissions')] and following-sibling::div[@class = 'rowh']]

Но я не могу выделить нужный мне div. Продолжает собирать ВСЕ дивы на странице. Ожидаемый результат должен быть:

CO2 Emissions
117 g/km
Standard Euro Emissions
EURO6

Ответы [ 4 ]

0 голосов
/ 31 января 2020

Это выражение XPath:

//div[contains(concat(' ',normalize-space(@class),' '),' rowh ')][contains(.,'Emissions')]
     /following-sibling::div[1]

Выбирает:

<div class="optexrow oid0 row " data-oid="0"> 
  <div class="key">CO2 Emissions</div>  
  <div class="value">117 g/km</div>  
  <div class="cf"/> 
</div>

Тест на здесь

Примечание: правильная идиома класса, использование оси следующего брата с позиционным предикатом.

0 голосов
/ 29 января 2020

// self :: div [содержит (@ data-oid, '0') и содержит (., 'Выбросы') или содержит (., "Расход топлива")]

это то, что Вы ищете?

0 голосов
/ 31 января 2020

Я перепробовал множество вариантов:
//div[contains(@class, 'optexrow')]/div[@class='key']/ancestor::div[starts-with(., 'Emissions')]

<div class="rowh">Emissions</div> - это брат <div class="optexrow oid0 row " data-oid="0">, а не предок.

//div[contains(@class, 'rowh') and contains(., 'Emissions')]/div[@class=key]

<div class="rowh">Emissions</div> не имеет дочерних узлов. <div class="key">CO2 Emissions</div> является дочерним узлом родного брата.

Я могу подумать о следующих запросах, которые выдают то, что вы хотите:

//div[starts-with(text(),'Emissions')]//following-sibling::div[position()<3]/div[@class=('key','value')]/normalize-space(text())
  • Выберите 2 div s вы используете жесткие позиции.
  • Выберите дочерние элементы div s с атрибутом, который имеет значения key и value, и верните нормализованный текстовый узел.
  • (И наоборот; div[@class!='cf'] также будет работать.)
//div[starts-with(@class,'optexrow') and following-sibling::div[starts-with(text(),'Engine')]]/div[@class=('key','value')]/normalize-space(text())
  • Выбрать все <div class="optexrow[...]"> "до" <div class="rowh">Engine[...]</div>
  • (. << ../div[...] вместо following-sibling::div[...] также будет работать.)

Оба запроса вернутся:

CO2 Emissions
117 g/km
Standard Euro Emissions
EURO6
0 голосов
/ 28 января 2020

Вы можете использовать следующее выражение: // div [@ class = "rowh" и содержит (text (), "Emissions")] @class для фильтрации типа класса "rowh" и содержит метод для фильтрации текста с "Emissions" .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...