如何用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
相关产品推荐
相关产品推荐

