如何用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
相关产品推荐
相关产品推荐

