You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

使用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()

二、解决重复数据的问题

重复数据的来源可能有两个:

  1. 页面重复加载:你代码里两次调用driver.get('https://w8shippingge.com/customer-zone/'),第一次登录后页面已经跳转,第二次再次访问可能导致数据重复加载;
  2. 表格本身存在重复行:页面表格里可能有重复的车型条目。

上面的代码通过以下方式解决:

  • 添加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

火山引擎 最新活动