Python嵌套for循环问题求助:PDF名称输出格式异常
问题解决:嵌套循环爬取Roco网站PDF信息格式不符
原代码核心问题
- PDF名称匹配错误:通过全局
soup.find获取col-download-data,只会拿到页面第一个匹配的文件名,无法对应当前遍历的PDF链接 - 输出格式未拼接:直接分开打印三个元素,未按「Roco + 产品编号 + PDF名称」的要求组合
- 逻辑冗余:遍历所有
<a>标签时,非PDF链接也会执行信息提取代码,导致无效操作 - 列表未利用:定义
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')
关键修改说明
- 精准匹配PDF名称:通过当前
<a>标签向上查找所在的<tr>表格行,再提取该行的文件名,确保每个PDF链接对应正确的名称 - 优化筛选逻辑:直接遍历带
onclick属性的<a>标签,用正则精准匹配.pdf结尾的链接,减少无效遍历 - 格式拼接:直接将三个元素组合成期望的字符串格式,符合输出要求
- 增加异常防护:对产品编号、父节点等增加空值校验,避免页面结构异常导致程序中断
- 有效收集结果:将所有PDF信息存入
pdflist,支持后续批量保存或处理
内容的提问来源于stack exchange,提问作者Filip Chobodicky
相关产品推荐
相关产品推荐

