使用Try Except解析HTML表格时如何避免重复数据,且实现无图片时仅输出车型名称
解决HTML表格解析的格式输出与重复数据问题
首先,咱们先梳理下你当前代码里的两个核心问题:输出格式不匹配(无图片时无法只显示车型)和可能出现的重复数据,接下来一步步解决:
一、修正输出格式,处理无图片的情况
你当前把车型和图片分开提取再zip的方式,容易出现索引对应错误,更稳妥的方式是遍历每一行时直接处理该行的车型和图片,这样能精准对应每一行的数据,同时自然处理无图片的场景:
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.chrome.service import Service from bs4 import BeautifulSoup import time password = "********" options = webdriver.ChromeOptions() #options.add_argument("--headless") path = (r'C:\Users\User\Downloads\chromedriver\chromedriver.exe') s = Service(path) driver = webdriver.Chrome(service=s, options=options) url = "https://w8shippingge.com/customer-zone/" driver.get(url) driver.find_element(By.NAME,'login').send_keys(password) driver.find_element(By.XPATH, '//*[@id="login-block"]/table/tbody/tr/td[3]/input').submit() # 等待页面加载完成(避免动态内容未加载导致的空数据) time.sleep(2) driver.get('https://w8shippingge.com/customer-zone/') # 再次等待页面加载 time.sleep(2) html = driver.page_source soup = BeautifulSoup(html, 'html.parser') table = soup.find("table", {"class":"autos"}) table_body = table.find('tbody') rows = table_body.find_all('tr') # 用于存储去重后的结果 unique_data = [] # 用集合记录已处理过的车型(避免重复) seen_models = set() for row in rows: all_td = row.find_all('td') # 跳过空行或者列数不足的行 if len(all_td) < 2: continue # 提取车型名称(对应你之前的k.text) model_name = all_td[3].text.strip() # 提取图片链接(对应你之前的i.a.img['src']) img_link = "" img_td = all_td[1] if img_td.a and img_td.a.img and 'src' in img_td.a.img.attrs: img_link = img_td.a.img['src'].strip() # 去重逻辑:如果车型没出现过,才添加到结果 if model_name not in seen_models: seen_models.add(model_name) # 构造输出格式 if img_link: result = f"[{model_name} {img_link}]" else: result = f"[{model_name}]" unique_data.append(result) print(result) driver.quit()
二、解决重复数据的问题
重复数据的来源可能有两个:
- 页面重复加载:你代码里两次调用
driver.get('https://w8shippingge.com/customer-zone/'),第一次登录后页面已经跳转,第二次再次访问可能导致数据重复加载; - 表格本身存在重复行:页面表格里可能有重复的车型条目。
上面的代码通过以下方式解决:
- 添加
seen_models集合,记录已经处理过的车型名称,确保同一个车型只输出一次; - 跳过空行和列数不足的行,避免无效数据干扰;
- 增加
time.sleep()等待页面动态内容加载完成,避免因为页面未加载完全导致的重复抓取(或者可以用Selenium的显式等待代替sleep,更优雅)。
额外优化建议
如果页面是动态加载的(比如滚动加载更多数据),你可能需要添加滚动逻辑或者显式等待元素加载完成,避免漏抓数据。另外,用Selenium的显式等待代替time.sleep()会更可靠,比如:
from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC # 登录后等待表格加载完成 WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.CLASS_NAME, "autos")) )
这样可以避免固定sleep时间导致的加载不充分或者等待过长的问题。
内容的提问来源于stack exchange,提问作者Mapper




