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

使用Python BeautifulSoup无法爬取FAA网页全部Fix链接求助

问题原因

你爬取不到Fix链接的核心原因是:目标页面的Fix列表是JavaScript动态渲染的。requests.get()只能获取页面的静态HTML源码,而那些Fix的链接是页面加载完成后通过JS动态生成的,初始静态HTML里根本没有这些内容,所以BeautifulSoup自然找不到。

解决方案

有两种可行方案,按需选择:

方案1:用Selenium模拟浏览器(直观易实现)

Selenium可以模拟真实浏览器的操作,执行JS渲染页面,从而获取动态生成的内容。

代码示例

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from bs4 import BeautifulSoup

# 初始化Chrome浏览器(需提前下载对应版本的chromedriver)
driver = webdriver.Chrome()
try:
    # 打开AZ州Fix搜索页面
    driver.get("https://nfdc.faa.gov/nfdcApps/services/ajv5/fix_search.jsp?selectType=state&selectName=AZ&keyword=")
    
    # 等待字母'A'的链接加载完成并点击
    wait = WebDriverWait(driver, 10)
    letter_a_link = wait.until(EC.element_to_be_clickable((By.LINK_TEXT, 'A')))
    letter_a_link.click()
    
    # 等待Fix列表加载完成
    wait.until(EC.presence_of_element_located((By.CLASS_NAME, 'fixlist')))
    
    # 获取渲染后的页面源码
    page_source = driver.page_source
    soup = BeautifulSoup(page_source, 'html.parser')
    
    # 提取所有Fix的详情链接
    fix_links = []
    for link in soup.select('.fixlist a'):
        href = link.get('href')
        if href and 'fix_detail.jsp' in href:
            # 补全完整URL(处理相对路径)
            full_url = f"https://nfdc.faa.gov/nfdcApps/services/ajv5/{href}" if href.startswith('/') else href
            fix_links.append(full_url)
    
    print(f"共找到{len(fix_links)}个Fix链接")
    print(fix_links[:5])  # 打印前5个示例链接
finally:
    # 关闭浏览器
    driver.quit()

方案2:直接调用AJAX接口(高效无浏览器依赖)

通过浏览器开发者工具的「网络」面板可以发现,点击字母'A'时,页面会发送请求到专门的接口获取Fix数据。直接请求该接口就能拿到包含Fix链接的HTML片段,无需模拟浏览器。

代码示例

import requests
from bs4 import BeautifulSoup

# 接口URL,替换letter参数可获取其他字母的Fix(A-Z)
url = "https://nfdc.faa.gov/nfdcApps/services/ajv5/fixesByLetter.jsp?state=AZ&letter=A"
response = requests.get(url)
response.encoding = 'utf-8'

soup = BeautifulSoup(response.text, 'html.parser')

# 提取Fix详情链接
fix_links = []
for link in soup.select('a'):
    href = link.get('href')
    if href and 'fix_detail.jsp' in href:
        full_url = f"https://nfdc.faa.gov/nfdcApps/services/ajv5/{href}"
        fix_links.append(full_url)

print(f"共找到{len(fix_links)}个Fix链接")
print(fix_links[:5])

若要获取AZ州所有字母分类的Fix,只需循环遍历A-Z的字母,替换接口URL中的letter参数即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 08:48:21