Как найти div с неуникальным идентификатором / классом, который содержит div с определенным текстом, а затем получить все теги ‹td› и ‹tr› под этим div

Итак, у меня есть HTML что-то вроде этого.

<div class="generic classname" id="generic ID name" >  // div1
<div class="presentation" id="body presentation">      // div2
<font>unique text</font>
<div class= "generic classname" id="generic ID name""> //div3
// under this div I have the table entry.
// multiple <td> and <tr>
</div>
</div>
</div>

Моя задача - сопоставить уникальный текст в div № 2, поэтому я могу найти элемент div номер 1, а затем получить всю таблицу в div № 3.

Проблема в том, что я не уверен, как найти div, у которого нет уникального имени класса или имени идентификатора. Я не могу использовать полный XPath, так как таблица меняется, а div меняются случайным образом.


person Bounty Collector    schedule 20.08.2020    source источник
comment
чтобы я мог найти элемент div номер 1, а затем Почему вы хотите рискнуть попасть в div1?   -  person DebanjanB    schedule 20.08.2020


Ответы (5)


Согласно HTML:

<div class="generic classname" id="generic ID name" >  // div1
    <div class="presentation" id="body presentation">      // div2
        <font>unique text</font>
        <div class= "generic classname" id="generic ID name"> //div3
            // under this div I have the table entry.
            // multiple <td> and <tr>
        </div>
    </div>
</div>

Поскольку ваш вариант использования не зависит от каких-либо атрибутов <div1>, вы можете легко избежать рассмотрения <div1>.


Решение

Чтобы найти третий <div>, у вас есть четыре следующих подхода:

  • Используя текст unique text и <div> attributes:

    //font[text()='unique text']//following::div[@class='generic classname' and @id='generic ID name']
    
  • Используя textunique text и index:

    //font[text()='unique text']//following::div[1]
    
  • Используя <div2>, у которого есть дочерний тег <font> с текстом как unique text и <div> attributes:

    //div[./font[text()='unique text']]//following-sibling::div[@class='generic classname' and @id='generic ID name']
    
  • Используя <div2>, у которого есть дочерний тег <font> с текстом как unique text и index:

    //div[./font[text()='unique text']]//following-sibling::div[1]
    
person DebanjanB    schedule 20.08.2020
comment
Еще один вопрос. Я также столкнулся со случаем, когда тег ‹div2› имеет другой тег ‹div› с «уникальным текстом». так что у div2 есть дочерний div, в котором есть текст. таблица находится на том же уровне, что и div2. Как мне тогда найти стол? - person Bounty Collector; 20.08.2020
comment
Тег @BountyCollector ... ‹div2› имеет еще один тег ‹div› с «уникальным текстом» ..., но мы рассматриваем тег <font> в первом и втором вариантах с «уникальным текстом». Итак, IMO, это все еще должно работать. - person DebanjanB; 20.08.2020
comment
Вы абсолютно правы. Я только что протестировал его для обоих случаев, и, похоже, он работает безупречно. Я новичок в этом деле, у вас есть рекомендации по использованию ресурсов? - person Bounty Collector; 21.08.2020
comment
@BountyCollector Получите любую документацию по xpath и проверьте ее на любом веб-сайте с помощью google-chrome-devtools < / а>. См. Обсуждения: это, это и это - person DebanjanB; 21.08.2020

Используйте приведенный ниже xpath со ссылкой на div 2, чтобы найти уникальный текст, а затем найдите div и таблицу внутри div.

//div[./font[text()='unique text']]/div[1]/table
person KunduK    schedule 20.08.2020

Если все ваши div вложены, как вы говорите, и ваша цель - получить таблицу в div3, вам не нужно получать родительский элемент.

Это один из вариантов:

//font[text()='unique text']/following-sibling::div

Этот xpath находит font с вашим уникальным текстом, затем его брат (тот же родитель) div

Этот идентификатор xpath - еще один вариант:

//font[text()='unique text']/parent::*/div

этот xpath находит font с вашим уникальным текстом, затем получает * (любой) родительский элемент, а затем получает соответствующий div внутри него.

Вы можете снова поднять родительские оси, если хотите div1.

В инструментах разработки выглядит так:  devtool single match

Это основано на вашем html, который выглядит так:

<div class="generic classname" id="generic ID name" >
    <div class="presentation" id="body presentation">
        <font>unique text</font>
        <div class="generic classname" id="generic ID name""> 
            // under this div I have the table entry.
            // multiple <td> and <tr>
        </div>
    </div>
</div>

Для другого HTML потребуется другой xpath, поэтому скажите, если вам нужно обновить.

person RichEdwards    schedule 20.08.2020

Я бы поискал или получил тег уникального текста с помощью js.

<script>
  // get the element
  let elem = document.getElementsByName('font');
</script>

https://www.w3schools.com/jsref/met_doc_getelementsbyname.asp

person Fl0r3    schedule 20.08.2020

Еще один вариант для вас:

//div[font='unique text']/div
person JaSON    schedule 20.08.2020