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

遍历TXT中多PDF URL提取标题报错,单URL正常求原因

解决多PDF URL遍历提取标题时的PyPDF2读取异常问题

我在遍历TXT文件中的PDF URL以提取PDF标题时遇到异常:当文件仅包含1个URL时代码运行正常,但存在多个URL时会抛出错误:raise utils.PdfReadError("Could not read malformed PDF file") PyPDF2.utils.PdfReadError: Could not read malformed PDF file。TXT文件格式为每行1个URL,无逗号及异常格式。相关代码如下:

import io
import requests
from bs4 import BeautifulSoup
from PyPDF2 import PdfFileReader

def extract_info_from_pdf_url():
    with open('pdfs.txt') as urls:
        for url in urls:
            r = requests.get(url)
            f = io.BytesIO(r.content)
            reader = PdfFileReader(f)
            title = reader.getDocumentInfo().title
            print(url)
            print(title)

extract_info_from_pdf_url()

可能的故障原因

结合你的场景和代码,我整理了几个最可能的问题点:

  • URL携带换行符:逐行读取txt时,每一行末尾默认会带有\n换行符。单个URL时,服务器可能自动忽略这个多余的字符,但多个URL时,后续的URL会因为带了换行符变成无效地址,下载的内容根本不是PDF,PyPDF2自然会报错说文件损坏。
  • 部分URL返回无效内容:虽然你说txt格式没问题,但可能其中某个URL已经失效、或者服务器返回了404页面/跳转后的HTML内容,这些都不是合法的PDF,解析时就会触发错误。单个URL时刚好选到了有效的,多个时碰到了无效的那个。
  • 缺少请求异常处理:你的代码没有处理请求失败的情况(比如超时、连接错误),如果某个URL请求返回残缺的内容,被当作PDF去解析,也会引发PdfReadError。

对应的修复建议

针对这些问题,你可以尝试以下调整:

  1. 清理URL的空白字符:在请求前用url.strip()去掉首尾的换行符、空格等,确保请求的是正确的地址。
  2. 校验响应内容:检查请求返回的Content-Type头是否为application/pdf,确认下载的是有效PDF文件。
  3. 添加异常捕获:给请求和解析过程加上try-except块,避免单个URL的错误导致整个程序崩溃,同时也能定位到具体出问题的URL。
  4. 启用PyPDF2非严格模式:创建PdfFileReader时加上strict=False,可以忽略一些轻微的PDF格式问题,提升容错性。

修改后的示例代码:

import io
import requests
from PyPDF2 import PdfFileReader

def extract_info_from_pdf_url():
    with open('pdfs.txt') as urls:
        for url in urls:
            url = url.strip()
            if not url:
                continue  # 跳过空行
            try:
                # 添加超时,避免请求卡住
                r = requests.get(url, timeout=10)
                # 检查请求是否成功(比如404、500都会触发异常)
                r.raise_for_status()
                # 验证返回的是PDF
                if 'application/pdf' not in r.headers.get('Content-Type', ''):
                    print(f"⚠️ 跳过 {url}: 返回内容不是PDF")
                    continue
                f = io.BytesIO(r.content)
                # 非严格模式解析
                reader = PdfFileReader(f, strict=False)
                doc_info = reader.getDocumentInfo()
                title = doc_info.title if doc_info else '无文档信息'
                print(f"✅ {url}")
                print(f"标题: {title if title else '未设置标题'}\n")
            except requests.exceptions.RequestException as e:
                print(f"❌ 请求 {url} 失败: {str(e)}\n")
            except Exception as e:
                print(f"❌ 解析 {url} 失败: {str(e)}\n")

extract_info_from_pdf_url()

内容的提问来源于stack exchange,提问作者Praxitelis Nikolaou

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 17:47:49