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

如何用Python爬取香港ITF政府网站表格?爬取失败求助

问题分析与解决方法

你的问题核心在于目标网站的表格数据是通过JavaScript动态渲染的,requests.get()只能获取页面的静态HTML骨架,实际表格内容还未被加载;另外也可能是请求时缺少必要的浏览器标识头,被服务器限制返回完整内容。以下是具体的解决思路和代码:


方法1:添加浏览器请求头,尝试获取静态内容

很多网站会校验请求中的User-Agent字段,模拟浏览器请求有可能拿到完整的页面内容:

from bs4 import BeautifulSoup
import requests
import pandas as pd

url = 'https://www.itf.gov.hk/en/project-search/project-profile/index.html?ReferenceNo=TVP/2122/22'
# 模拟Chrome浏览器的请求头
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36'
}

page = requests.get(url, headers=headers)
soup = BeautifulSoup(page.text, 'html.parser')

table = soup.find('table', {'class': 'colorTbl projDetailTbl'})
if table:
    # 提取表头
    headers = [th.text.strip() for th in table.find_all('th')]
    df = pd.DataFrame(columns=headers)
    # 提取表格行数据
    for row in table.find_all('tr')[1:]:
        row_data = [td.text.strip() for td in row.find_all('td')]
        df.loc[len(df)] = row_data
    print(df)
else:
    print("未找到目标表格,大概率是内容动态加载导致")

方法2:用Selenium处理动态渲染页面

如果添加请求头仍无效,说明内容完全由JavaScript生成,需要用Selenium模拟浏览器加载页面:
首先安装依赖:

pip install selenium

然后编写代码(需提前下载对应浏览器的驱动,比如ChromeDriver):

from bs4 import BeautifulSoup
import pandas as pd
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
import time

url = 'https://www.itf.gov.hk/en/project-search/project-profile/index.html?ReferenceNo=TVP/2122/22'

# 配置Chrome无头模式(后台运行,不弹出浏览器窗口)
chrome_options = Options()
chrome_options.add_argument('--headless=new')
chrome_options.add_argument('--disable-gpu')
chrome_options.add_argument('User-Agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36')

driver = webdriver.Chrome(options=chrome_options)
driver.get(url)
# 等待页面加载完成(可根据实际情况调整等待时间)
time.sleep(3)

# 获取加载后的页面源码
page_source = driver.page_source
soup = BeautifulSoup(page_source, 'html.parser')

table = soup.find('table', {'class': 'colorTbl projDetailTbl'})
if table:
    headers = [th.text.strip() for th in table.find_all('th')]
    df = pd.DataFrame(columns=headers)
    for row in table.find_all('tr')[1:]:
        row_data = [td.text.strip() for td in row.find_all('td')]
        df.loc[len(df)] = row_data
    print(df)
else:
    print("未找到目标表格")

# 关闭浏览器驱动
driver.quit()

方法3:抓包获取API接口(高效进阶)

打开浏览器开发者工具(F12),切换到Network标签页,刷新页面后过滤XHR请求,找到返回项目数据的API接口。直接请求该接口获取JSON格式数据,比解析HTML更高效,也能避免动态渲染的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 13:39:40