You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python嵌套for循环问题求助:PDF名称输出格式异常

问题解决:嵌套循环爬取Roco网站PDF信息格式不符

原代码核心问题

  1. PDF名称匹配错误:通过全局soup.find获取col-download-data,只会拿到页面第一个匹配的文件名,无法对应当前遍历的PDF链接
  2. 输出格式未拼接:直接分开打印三个元素,未按「Roco + 产品编号 + PDF名称」的要求组合
  3. 逻辑冗余:遍历所有<a>标签时,非PDF链接也会执行信息提取代码,导致无效操作
  4. 列表未利用:定义pdflist但未用于收集PDF信息,无法批量处理结果

修正后的代码

import requests
from bs4 import BeautifulSoup
import re

productlinks = []

# 提取产品列表页面的链接
for x in range(1, 2):
    r = requests.get(
        f'https://www.roco.cc/ren/products/locomotives/steam-locomotives.html?p={x}&verfuegbarkeit_status=41%2C42%2C43%2C45%2C44')
    soup = BeautifulSoup(r.content, 'lxml')
    productlist = soup.find_all('li', class_='item product product-item')

    for item in productlist:
        link = item.find('a', class_='product-item-link', href=True)
        if link:  # 增加空值判断,避免无效链接
            productlinks.append(link['href'])

pdflist = []

# 遍历每个产品页面提取PDF信息
for url in productlinks:
    r = requests.get(url, allow_redirects=False)
    soup = BeautifulSoup(r.content, 'html.parser')
    
    # 获取产品编号
    try:
        reference = soup.find('span', class_='product-head-artNr').get_text().strip()
    except Exception as e:
        print(f"获取产品编号失败: {e}")
        reference = "未知编号"
    
    # 仅遍历带onclick属性的a标签,精准筛选PDF链接
    for tag in soup.find_all('a', onclick=True):
        on_click = tag.get('onclick')
        pdf_match = re.findall(r"'([^']*\.pdf)'", on_click)  # 匹配以.pdf结尾的链接
        if pdf_match:
            # 从当前PDF链接所在的表格行中提取对应名称
            try:
                parent_tr = tag.find_parent('tr')
                pdfname = parent_tr.find('td', class_='col-download-data').get_text().strip() if parent_tr else "未知名称"
            except Exception as e:
                print(f"获取PDF名称失败: {e}")
                pdfname = "未知名称"
            
            # 拼接成期望格式并收集
            pdf_info = f"Roco {reference} {pdfname}"
            pdflist.append(pdf_info)
            print(pdf_info)

# 可选:保存结果到文件
# with open('roco_pdf_info.txt', 'w', encoding='utf-8') as f:
#     for info in pdflist:
#         f.write(info + '\n')

关键修改说明

  1. 精准匹配PDF名称:通过当前<a>标签向上查找所在的<tr>表格行,再提取该行的文件名,确保每个PDF链接对应正确的名称
  2. 优化筛选逻辑:直接遍历带onclick属性的<a>标签,用正则精准匹配.pdf结尾的链接,减少无效遍历
  3. 格式拼接:直接将三个元素组合成期望的字符串格式,符合输出要求
  4. 增加异常防护:对产品编号、父节点等增加空值校验,避免页面结构异常导致程序中断
  5. 有效收集结果:将所有PDF信息存入pdflist,支持后续批量保存或处理

内容的提问来源于stack exchange,提问作者Filip Chobodicky

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 16:15:43