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

如何用BeautifulSoup4根据文件扩展名筛选PDF文件?

如何用BeautifulSoup4筛选维基共享资源分类里的PDF文件详情

问题背景

我已经用Python的BeautifulSoup4爬取了维基共享资源某个分类页面的所有文件信息,这个分类里既有.jpg图片也有.pdf文档。现在的代码能输出所有文件名,但我只想拿到PDF文件的详情,该怎么改?

我当前的代码是这样的:

#!/usr/bin/env python 
# -*- coding: utf-8 -*- 
import requests 
from bs4 import BeautifulSoup 

rUrl = u'https://commons.wikimedia.org/wiki/Category:பண்டிதர் க. அயோத்திதாசர்' 
# 获取分类页面数据
rData = requests.get(rUrl) 
soup = BeautifulSoup(rData.content, 'lxml') 

# 输出所有文件名
for item in soup.find_all('div', class_='gallerytext'): 
    fileTags = item.a 
    print(fileTags.text) 
# 这里想改成只拿PDF的信息

现在的输出混着JPG和PDF:

Oru paisa tamilan 1.jpg 
Oru paisa tamilan 2.jpg 
ஒரு பூர்வ பௌத்தனின் சாட்சியம்-அயோத்திதாசரின் சொல்லாடல்.pdf 
க. அயோத்திதாஸப் பண்டிதர் சிந்தனைகள்-1.pdf 
க. அயோத்திதாஸப் பண்டிதர் சிந்தனைகள்-2.pdf 
க. அயோத்திதாஸப் பண்டிதர் சிந்தனைகள்-4.pdf 
க. அயோத்திதாஸப் பண்டிதர் சிந்தனைகள்-அரசியல்-சமூகம்.pdf 
பண்டிதரின் கொடை-விகிதாச்சார உரிமை எனும் சமூகநீதிக் கொள்கை.pdf 

解决方案

其实很简单,只需要在获取到文件名后,加个判断条件筛选出以.pdf结尾的文件就行。给你两种修改方式:

方法一:直接在循环里过滤

这是最直观的方式,修改循环部分的代码:

#!/usr/bin/env python 
# -*- coding: utf-8 -*- 
import requests 
from bs4 import BeautifulSoup 

rUrl = u'https://commons.wikimedia.org/wiki/Category:பண்டிதர் க. அயோத்திதாசர்' 
rData = requests.get(rUrl) 
soup = BeautifulSoup(rData.content, 'lxml') 

# 只筛选PDF文件
for item in soup.find_all('div', class_='gallerytext'): 
    file_name = item.a.text 
    # 判断文件名是否以.pdf结尾(加lower()避免大小写问题)
    if file_name.lower().endswith('.pdf'): 
        print(f"PDF文件名: {file_name}")
        # 如果需要获取文件的页面链接,还可以加这行:
        # file_page_url = f"https://commons.wikimedia.org{item.a['href']}"
        # print(f"文件页面链接: {file_page_url}")

方法二:进阶版——获取PDF的下载链接(可选)

如果你不只是要文件名,还想直接拿到PDF的下载地址,可以进一步解析每个PDF的页面:

#!/usr/bin/env python 
# -*- coding: utf-8 -*- 
import requests 
from bs4 import BeautifulSoup 

rUrl = u'https://commons.wikimedia.org/wiki/Category:பண்டிதர் க. அயோத்திதாசர்' 
base_url = "https://commons.wikimedia.org"
rData = requests.get(rUrl) 
soup = BeautifulSoup(rData.content, 'lxml') 

for item in soup.find_all('div', class_='gallerytext'): 
    file_name = item.a.text 
    if file_name.lower().endswith('.pdf'): 
        # 跳转到文件详情页
        file_page_url = base_url + item.a['href']
        file_page_data = requests.get(file_page_url)
        file_soup = BeautifulSoup(file_page_data.content, 'lxml')
        # 找到下载链接(页面里的"下载文件"按钮对应的链接)
        download_link = file_soup.find('a', class_='internal', text='下载文件')['href']
        print(f"文件名: {file_name}")
        print(f"下载链接: {base_url + download_link}\n")

说明

  • endswith('.pdf')是Python字符串的内置方法,专门用来判断字符串结尾,刚好匹配我们筛选PDF的需求;加.lower()是为了兼容可能存在的大写后缀(比如.PDF)。
  • 进阶版的思路是先拿到PDF的详情页链接,再从详情页里提取下载地址,适合需要直接批量下载文件的场景。

内容的提问来源于stack exchange,提问作者info-farmer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:27:25