xpath для поиска строк, содержащих 1 тр и 1 й - PullRequest
1 голос
/ 02 апреля 2020

Мне нужна помощь в написании xpath для поиска строк в таблице, которая содержит только 1-й и 1-й тд

пример html

<!DOCTYPE html>
<html>
<head>
    <title></title>
</head>
<body>
    <table>
        <tr>
            <th>test</th>
            <td>abc</td>
        </tr>
        <tr>
            <th>test1</th>
            <td>abc</td>
            <td>abc</td>
        </tr>
            <th>test2</th>
            <td>abc</td>
    </table>
</body>
</html>

для этого html Я ожидаю только первая строка и последняя, ​​если строка содержит что-то кроме th и td, ее следует пропустить

'//table/tr[th and td]' Я достиг этого xpath, но это будет включать повторное td не фильтрует, если строка содержит другое <a или что-нибудь

Ответы [ 2 ]

0 голосов
/ 03 апреля 2020

Один лайнер XPath:

//tr[count (./*)=2 and count(./th)=1 and count(./td)=1]
0 голосов
/ 02 апреля 2020

Это выполнимо - не очень элегантно, но работает. Я расширил ваш пример html, чтобы представить еще несколько проблемных c узлов:

test = """
<!DOCTYPE html>
<html>
<head>
    <title></title>
</head>
<body>
    <table>
        <tr>
            <th>test</th>
            <td>abc</td>
        </tr>
        <tr>
            <th>test1</th>
            <td>abc</td>
            <td>abc</td>
        </tr>
        <tr>
            <th>test2</th>
            <td>abc</td>
        </tr>
        <tr>
            <a>test3</a>
            <td>abcd</td>
        </tr>
        <tr>
            <td>test4</td>
            <td>abcd</td>
        </tr>
    </table>
</body>    """

import lxml.html
doc = lxml.html.fromstring(test)
good_tags = ['th','td']
targs = doc.xpath('//tr')
for targ in targs:
    tr = targ.xpath('.//*')
    if len(tr)==2 and (tr[0].tag != tr[1].tag) and tr[0].tag in good_tags and tr[1].tag in good_tags:            
        print(lxml.html.tostring(targ).decode())

Вывод:

<tr>
            <th>test</th>
            <td>abc</td>
        </tr>

<tr>
            <th>test2</th>
            <td>abc</td>
        </tr>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...