为了账号安全,请及时绑定邮箱和手机立即绑定

xpath 查找包含 1 tr 和 1 th 的行

xpath 查找包含 1 tr 和 1 th 的行

FFIVE 2023-10-30 15:23:37
我需要帮助编写 xpath 来查找仅包含第 1 个和 1 个 td 的表中的行示例 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 回答

?
宝慕林4294392

TA贡献2021条经验 获得超8个赞

这是可行的——不是很优雅,但是有效。我扩展了您的示例 html,引入了一些更多有问题的节点:


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>


查看完整回答
反对 回复 2023-10-30
?
绝地无双

TA贡献1946条经验 获得超4个赞

一班 XPath :

//tr[count (./*)=2 and count(./th)=1 and count(./td)=1]


查看完整回答
反对 回复 2023-10-30
  • 2 回答
  • 0 关注
  • 104 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信