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

Python爬虫抓取EAN编码全部输出在同一行,代码哪里存在问题?

问题根因与修复方案

核心问题

你当前输出为单行的根本原因是:file.write()方法不会自动在写入内容末尾追加换行符,你每次抓取到的EAN直接连续写入文件,自然会拼接成一整行。
另外代码中存在冗余请求逻辑:你已经用requests.get(link)请求了子页面,前面的urllib.request.urlopen(link)是完全多余的操作,不仅浪费请求资源,还可能触发站点反爬限制,建议直接删除。

修复后的代码

import requests
from bs4 import BeautifulSoup
import os

subpage = 1

while subpage <= 2:
    URL = "https://..." + str(subpage)
    # 增加超时参数避免请求卡住
    page = requests.get(URL, timeout=10)
    soup = BeautifulSoup(page.content, "html.parser")

    """writes all links under the h2 tag into a list"""
    links = []
    h2s = soup.find_all("h2")
    for h2 in h2s:
        links.append("http://www.xxxxxxxxxxx.com" + h2.a['href'])

    """opens links from list and extracts EAN number from underlying page"""
    with open("temp.txt", "a") as output:
        for link in links:
            # 删掉冗余的urllib请求
            page_2 = requests.get(link, timeout=10)
            soup_2 = BeautifulSoup(page_2.content, "html.parser")
            if "EAN:" in soup_2.text:
                span = soup_2.find(class_="articleData_ean")
                # 增加空值判断避免匹配不到时报错
                if span and span.a:
                    EAN = span.a.text
                    # 写入时追加换行符
                    output.write(EAN + '\n')
        subpage += 1

os.replace('temp.txt', 'EANs.txt')

额外优化建议

  • 可以把文件打开的with open语句提到分页循环的外层,避免每次翻页都重复打开关闭文件,降低IO开销
  • 可以给请求增加User-Agent头,降低被站点反爬拦截的概率
  • 如果需要处理大量分页,建议增加请求间隔,避免请求频率过高触发限制

内容的提问来源于stack exchange,提问作者Markus Krieger

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 19:36:03