-
动态加载内容:该网页可能是通过 JavaScript 动态加载的,而
requests
无法处理动态内容。因此,直接使用requests
获取到的 HTML 中可能不包含 PDF 链接。 -
HTML 结构不匹配:网页结构可能与你预期的不同,导致
BeautifulSoup
查找不到匹配的标签。你可以检查 HTML 的结构,确保你使用的选择器(例如class_='iconfont iconxiazai'
)正确。
解决方法:
-
检查网页内容:
在代码中打印页面的HTML内容,看看requests.get()
获取到的网页是否包含PDF链接的部分:print(response.text) # 打印获取到的HTML内容
-
使用Selenium处理动态加载的网页:
如果网页使用了动态加载技术(例如AJAX或JavaScript),可以使用Selenium
来模拟浏览器操作,并获取完整的页面内容。
Selenium 示例代码:
以下是如何使用 Selenium
来处理动态加载网页的示例:
安装依赖:
pip install selenium
你还需要下载对应的浏览器驱动(如ChromeDriver),并将其路径加入系统环境变量。
代码示例:
import os
from selenium import webdriver
from bs4 import BeautifulSoup
import time
# 设置你要保存PDF文件的目录
DOWNLOAD_DIR = "pdf_downloads"
if not os.path.exists(DOWNLOAD_DIR):
os.makedirs(DOWNLOAD_DIR)
# 设置目标URL
base_url = "https://www.sse.com.cn"
# 目标网页的公告URL
announcement_url = "https://www.sse.com.cn/disclosure/listedinfo/announcement/"
# 启动浏览器
driver = webdriver.Chrome() # 请确保你已安装并配置了对应的ChromeDriver
driver.get(announcement_url)
# 等待页面加载完成
time.sleep(5)
# 获取页面内容
html = driver.page_source
soup = BeautifulSoup(html, 'html.parser')
# 查找所有带有PDF文件链接的<a>标签
pdf_links = soup.find_all('a', href=True)
# 遍历查找到的所有链接,下载PDF
for link in pdf_links:
pdf_relative_url = link['href'] # 获取相对路径
if pdf_relative_url.endswith('.pdf'):
pdf_url = base_url + pdf_relative_url # 拼接成完整的URL
pdf_name = os.path.join(DOWNLOAD_DIR, pdf_url.split("/")[-1]) # 使用文件名保存PDF
# 下载PDF文件
print(f"Downloading {pdf_name}...")
pdf_response = requests.get(pdf_url)
with open(pdf_name, 'wb') as pdf_file:
pdf_file.write(pdf_response.content)
print(f"Downloaded {pdf_name}")
# 关闭浏览器
driver.quit()
print("All PDF files have been downloaded.")
关键步骤:
- Selenium 模拟浏览器:Selenium 会加载页面,确保动态加载的内容能够被正确解析。
-
处理动态内容:通过
driver.page_source
获取完整的页面HTML,然后使用BeautifulSoup
进行解析。
总结:
使用 Selenium
可以解决动态加载的内容问题,并且通过这种方式,你可以抓取到包含PDF链接的完整网页内容。如果网页确实是动态生成的,那么这种方法应该可以帮助你成功获取PDF文件的链接。