Scrapy/Python:如何获取TR元素在表格中的绝对索引?
获取TR元素相对于所有table下TR的绝对索引
嘿,这个需求我刚好碰到过,给你几个靠谱的实现方法,按需选就行:
方法1:用XPath直接计算索引(最推荐)
你可以在定位目标TR的同时,直接通过XPath表达式算出它在整个//table//tr集合里的绝对位置。代码大概是这样:
target_trs = response.xpath('//table//tr[td[@class="ad73"]]') for tr in target_trs: # 统计当前TR之前所有table下的TR数量,加1就是它的绝对索引(从1开始计数) absolute_index = tr.xpath('count(preceding::table//tr) + 1').get() print(f"这个TR的绝对索引是:{absolute_index}")
这里的preceding::table//tr会抓取当前TR节点之前所有属于table的TR元素,用count统计数量后加1,就得到了它在全局TR列表里的位置,逻辑很直接。
方法2:先拿全量TR再匹配索引
如果觉得XPath表达式有点绕,也可以换个直观的思路:先把页面里所有//table//tr都取出来,再挨个找到目标TR对应的位置:
# 先获取所有table下的TR元素列表 all_trs = response.xpath('//table//tr') # 拿到你的目标TR集合 target_trs = response.xpath('//table//tr[td[@class="ad73"]]') # 遍历每个目标TR,匹配它在全量列表里的索引 for target_tr in target_trs: # 用TR的HTML片段作为唯一标识来匹配(也可以用元素的hash值) target_html = target_tr.get() for idx, tr in enumerate(all_trs, start=1): if tr.get() == target_html: print(f"找到啦,索引是:{idx}") break
这种方法逻辑简单易懂,但如果页面里TR特别多的话,效率会稍低一些,适合页面结构不复杂的场景。
方法3:一次性获取索引+元素(更简洁)
如果想一步到位,还可以用XPath的for表达式直接构造包含索引和元素的结果集合:
# 用XPath循环,同时返回索引和对应的TR元素 result = response.xpath('for $tr in //table//tr[td[@class="ad73"]] return (count($tr/preceding::table//tr) + 1, $tr)') # 每两个元素一组,第一个是索引,第二个是TR元素 for i in range(0, len(result), 2): idx = result[i].get() tr_elem = result[i+1] print(f"索引:{idx},TR内容:{tr_elem.get()}")
这种写法更紧凑,直接让XPath帮你完成索引计算,不用额外写循环匹配。
另外提一句:如果你的需求是每个TR在它所属的单个table内的索引,而不是全局所有table下的绝对索引,只需要把XPath里的preceding::table//tr改成preceding-sibling::tr就行,这样统计的是当前TR在同一个父table下的前序TR数量。
内容的提问来源于stack exchange,提问作者Edgar E.
相关产品推荐
相关产品推荐

