遍历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。
对应的修复建议
针对这些问题,你可以尝试以下调整:
- 清理URL的空白字符:在请求前用
url.strip()去掉首尾的换行符、空格等,确保请求的是正确的地址。 - 校验响应内容:检查请求返回的
Content-Type头是否为application/pdf,确认下载的是有效PDF文件。 - 添加异常捕获:给请求和解析过程加上try-except块,避免单个URL的错误导致整个程序崩溃,同时也能定位到具体出问题的URL。
- 启用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
相关产品推荐
相关产品推荐

