网页爬取时条目单/双行布局不固定,如何调整枚举循环逻辑?
问题解决方案
你原有逻辑的问题在于使用固定步长的for循环遍历,而条目占行数不固定,索引计算会出现偏移,导致漏爬或者重复爬取。改用手动控制行指针的while循环即可解决该问题。
优化后的逻辑思路
- 先预获取表格所有行的总数,确定循环边界
- 初始化行指针从1开始(匹配xpath的索引规则)
- 每次判断当前指针指向的行属于1行条目还是2行条目:
- 若为1行条目:处理完成后指针+1
- 若为2行条目:处理完当前行和下一行的内容后指针+2
- 循环直到指针超过总行数,即可遍历所有行
优化后代码示例
from selenium.common.exceptions import NoSuchElementException import requests # 用于发送Telegram消息 # 预获取表格所有行,减少重复DOM查询提升效率 all_rows = browser.find_elements_by_xpath('//*[@id="grdDocumentos"]/tbody/tr') total_row_count = len(all_rows) current_line = 1 BOT_TOKEN = "你的Telegram机器人token" CHAT_ID = "接收消息的聊天ID" while current_line <= total_row_count: try: # 沿用你原有逻辑判断是否为2行条目 is_two_line = bool(browser.find_element_by_xpath( f'//*[@id="grdDocumentos"]/tbody/tr[{current_line}]/td' ).text) if is_two_line: # 提取2行条目的内容,可根据需求拼接两行的字段 empresa = browser.find_element_by_xpath( f'//*[@id="grdDocumentos"]/tbody/tr[{current_line}]/td[2]' ).text # 如需提取第二行内容可补充对应xpath逻辑 # sub_content = browser.find_element_by_xpath(f'//*[@id="grdDocumentos"]/tbody/tr[{current_line+1}]/td').text current_line += 2 else: # 提取1行条目的内容 empresa = browser.find_element_by_xpath( f'//*[@id="grdDocumentos"]/tbody/tr[{current_line}]/td[2]' ).text current_line += 1 # 直接发送到Telegram requests.post( url=f"https://api.telegram.org/bot{BOT_TOKEN}/sendMessage", data={"chat_id": CHAT_ID, "text": empresa} ) except NoSuchElementException: # 捕获元素不存在的异常,跳过异常行避免程序崩溃 current_line += 1 continue
其他优化建议
- 不要使用裸
except,指定捕获NoSuchElementException可避免掩盖代码其他逻辑错误 - 预获取所有行元素可减少Selenium重复查询DOM的次数,提升爬取效率同时降低元素定位失败概率
- 发送Telegram消息时可对特殊字符做转义处理,避免接口调用失败
内容的提问来源于stack exchange,提问作者Frantiescoli Dimer
相关产品推荐
相关产品推荐

