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

如何使用BeautifulSoup爬取指定网页中的表格?

问题描述

我需要爬取以下网页中的所有表格:https://venezuela360.org/arcgis/apps/sites/#/infraestructura-geoespacial/datasets/3d0308d198ba422fbdabd2e1859eb577/data?geometry=-84.125%2C-0.931%2C-49.233%2C14.299。我尝试了如下代码,但无法正常运行,输出"No se encontró la tabla":

import requests
from bs4 import BeautifulSoup

url = 'https://venezuela360.org/arcgis/apps/sites/#/infraestructura-geoespacial/datasets/3d0308d198ba422fbdabd2e1859eb577/data?geometry=-84.125%2C-0.931%2C-49.233%2C14.299&page=1316'
page = requests.get(url)

soup = BeautifulSoup(page.text, 'lxml')

table_data = soup.find('table', class_='table table-striped table-bordered table-hover')

if table_data is None:
    print("No se encontró la tabla")
问题原因

这个网站是基于ArcGIS构建的单页应用(SPA),表格内容是通过JavaScript动态加载的。requests.get()只能获取页面的初始HTML源码,此时表格还未被渲染出来,所以BeautifulSoup找不到对应的表格元素。

解决方法

方法1:使用Selenium模拟浏览器渲染页面

Selenium可以模拟真实浏览器加载页面并执行JavaScript,能获取到完全渲染后的页面内容。

代码示例:

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
import pandas as pd

# 初始化Chrome浏览器(需提前下载对应版本的chromedriver)
driver = webdriver.Chrome()
url = 'https://venezuela360.org/arcgis/apps/sites/#/infraestructura-geoespacial/datasets/3d0308d198ba422fbdabd2e1859eb577/data?geometry=-84.125%2C-0.931%2C-49.233%2C14.299&page=1316'

driver.get(url)

# 等待表格加载完成(最多等待10秒)
try:
    table = WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.CLASS_NAME, 'table-striped'))
    )
    # 用pandas直接读取表格内容
    df = pd.read_html(table.get_attribute('outerHTML'))[0]
    print(df)
    # 保存为CSV文件
    df.to_csv('venezuela_infraestructura.csv', index=False)
finally:
    driver.quit()

方法2:直接调用API接口(更高效)

打开浏览器开发者工具(F12),切换到「Network」面板,刷新页面后筛选「XHR」或「Fetch」请求,能找到网站获取表格数据的API接口。直接请求该接口可以拿到结构化的JSON数据,无需处理页面渲染。

示例步骤:

  1. 打开目标页面,按F12打开开发者工具
  2. 切换到「Network」→「XHR」标签
  3. 刷新页面或切换分页,找到包含数据集的请求(通常URL包含query或dataset关键词)
  4. 复制该请求的URL、请求头和参数,用requests直接请求:
import requests
import pandas as pd

# 替换为你找到的真实API接口URL
api_url = "https://venezuela360.org/arcgis/rest/services/.../query"
params = {
    "where": "1=1",
    "outFields": "*",
    "f": "json",
    # 其他必要参数从开发者工具中复制
}

response = requests.get(api_url, params=params)
data = response.json()

# 将JSON数据转换为DataFrame
df = pd.DataFrame([feature['attributes'] for feature in data['features']])
print(df)
df.to_csv('venezuela_infraestructura.csv', index=False)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 20:34:50