抓取 FedEx 多包裹页面时,同一状态可能在 DOM 中出现多次。用列表 append 会原样保留重复;改成 set 即可去重。

改法

from bs4 import BeautifulSoup

def summarize_piece_shipment(page_html: str) -> str:
    soup = BeautifulSoup(page_html, "html.parser")
    piece_shipment = soup.find("h2", string=lambda t: t and "Piece Shipment" in t)
    if not piece_shipment:
        return "否"

    undelivered = set()
    all_delivered = True
    for package in soup.find_all("tr", class_="fdx-c-table__tbody__tr"):
        link = package.find("a", class_="fdx-u-color--blue")
        status_el = package.find("div", class_="shipment-status__key")
        if not link or not status_el:
            continue
        no, status = link.text.strip(), status_el.text.strip()
        if status != "Delivered":
            all_delivered = False
            undelivered.add(f"{no}: {status}")
    return "该货件的其它包裹全部送达" if all_delivered else ", ".join(sorted(undelivered))

要点

  • 集合用 add,不要用 append
  • 输出前 sorted(...) 可让结果稳定,便于日志对比。
  • 去重键建议包含“单号 + 状态”,避免不同包裹被误合并。