" />

Xpath - Как выбрать связанные данные двоюродного брата

xpath xpath-1.0

128 просмотра

2 ответа

<html>
    <table border="1">
        <tbody>
            <tr>
                <td>
                    <table border="1">
                        <tbody>
                            <tr>
                                <th>aaa</th>
                                <th>bbb</th>
                                <th>ccc</th>
                                <th>ddd</th>
                                <th>eee</th>
                                <th>fff</th>
                            </tr>
                            <tr>
                                <td>111</td>
                                <td>222</td>
                                <td>333</td>
                                <td>444</td>
                                <td>555</td>
                                <td>666</td>
                            </tr>
                        </tbody>
                    </table>
                </td>
            </tr>
        </tbody>
    </table>
</html>

Как я могу выбрать конкретные связанные данные двоюродного брата с помощью xpath, желаемый результат будет:

<th>aaa</th>
<th>ccc</th>
<th>fff</th>
<td>111</td>
<td>333</th>
<td>666</td>

Наиболее важным аспектом xpath является то, что я хочу иметь возможность включать или исключать определенные <th>теги и соответствующие <td>теги

Итак, на основании ответов, наиболее близких мне:

//th[not(contains(text(), "ddd"))] | //tr[2]/td[not(position()=4)]

Есть ли способ не использовать явно, position()=4но вместо этого ссылаться на соответствующий thтег

Автор: Darth Источник Размещён: 20.09.2019 02:23

Ответы (2)


0 плюса

Решение

Я не уверен, что это лучшее решение, но вы можете попробовать

//th[not(.="bbb") and not(.="ddd") and not(.="eee")] | //tr[2]/td[not(position()=index-of(//th, "bbb")) and not(position()=index-of(//th, "ddd")) and not(position()=index-of(//th, "eee"))]

или более короткая версия

//th[not(.=("bbb", "ddd", "eee"))]| //tr[2]/td[not(position()=(index-of(//th, "bbb"), index-of(//th, "ddd"),index-of(//th, "eee")))]

это возвращает

<th>aaa</th>
<th>ccc</th>
<th>fff</th>
<td>111</td>
<td>333</td>
<td>666</td>

Вы можете избежать использования сложных XPathвыражений для получения необходимого результата. Попробуйте использовать Python+ Seleniumфункции вместо:

# Get list of th elements
th_elements = driver.find_elements_by_xpath('//th')
# Get list of td elements
td_elements = driver.find_elements_by_xpath('//tr[2]/td')
# Get indexes of required th elements - [0, 2, 5]
ok_index = [th_elements.index(i) for i in th_elements if i.text not in ('bbb', 'ddd', 'eee')]
for i in ok_index:
    print(th_elements[i].text)
for i in ok_index:
    print(td_elements[i].text)

Выход

'aaa'
'ccc'
'fff'
'111'
'333'
'666'

Если вам нужно XPath 1.0решение:

//th[not(.=("bbb", "ddd", "eee"))]| //tr[2]/td[not(position()=(count(//th[.="bbb"]/preceding-sibling::th)+1, count(//th[.="ddd"]/preceding-sibling::th)+1, count(//th[.="eee"]/preceding-sibling::th)+1))]
Автор: Andersson Размещён: 05.06.2017 03:48

1 плюс

Используя XPath 3.0, вы можете структурировать это в

let $th := //table/tbody/tr[1]/th, 
$filteredTh := $th[not(. = ("bbb", "ddd", "eee"))], 
$pos := $filteredTh!index-of($th, .)
return ($filteredTh, //table/tbody/tr[position() gt 1]/td[position() = $pos])
Автор: Martin Honnen Размещён: 05.06.2017 04:11
Вопросы из категории :
32x32
aaa