You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用XPath仅统计子级tr元素,排除孙级tr元素?

如何统计目标tbody的直接子tr元素数量(排除嵌套表格的tr)

你遇到的问题是因为//tr会匹配所有层级的<tr>元素,包括嵌套在子表格里的那些,所以才会得到8个结果。要只统计目标<tbody>的直接子节点<tr>,需要用更精确的XPath表达式。

解决方案:使用直接子节点选择符/

XPath中,/用于选择当前节点的直接子节点,而//会选择所有后代节点。所以你需要先定位到目标<tbody>,再用/tr来选择它的直接子tr:

修改你的代码中的XPath部分:

from lxml import etree

html_string = '''
<!DOCTYPE html>
<html lang="en">
    <head>
        <title>title</title>
    </head>
    <body>
        <div class="books">
            <table width="100%" cellspacing="0" cellpadding="0" border="0">
                <tbody>
                    <tr> <!-- want to count -->
                        <td><p class="en">name:</p>
                        </td>
                        <td>
                            <table width="780" cellspacing="0" cellpadding="0" border="0" class="noComma">
                                <tbody>
                                    <tr>……</tr>
                                    <tr>……</tr>
                                    <tr>……</tr>
                                </tbody>
                            </table>
                        </td>
                    </tr>
                    <tr> <!-- want to count -->
                        <td style="width: 200px" class="left_title">
                            <p class="en">name:</p>
                        </td>
                        <td>
                            <table width="780" cellspacing="0" cellpadding="0" border="0" class="noComma">
                                <tbody>
                                    <tr>……</tr>
                                    <tr>……</tr>
                                    <tr>……</tr>
                                </tbody>
                            </table>
                        </td>
                    </tr>
                </tbody>
            </table>
        </div>
    </body>
</html>
'''

html = etree.HTML(html_string)
# 定位到目标tbody的直接子tr
trs = html.xpath('//div[@class="books"]/table/tbody/tr')
print(len(trs))  # 输出:2

另一种写法:先定位目标tbody再选子tr

如果目标<tbody>的父元素标识不明确,也可以先找到目标<tbody>节点,再用相对路径选择它的直接子tr:

tbody = html.xpath('//div[@class="books"]/table/tbody')[0]
trs = tbody.xpath('./tr')
print(len(trs))  # 输出:2

核心逻辑

  • //tr:匹配文档中所有<tr>元素(包括嵌套表格里的)
  • 目标节点/tr:只匹配目标节点的直接子节点<tr>,不会包含后代层级的<tr>

内容的提问来源于stack exchange,提问作者developer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 06:50:27