讲师中心 微信公众号
AI工具推荐 视频效率加速

如何用 Python 将网页表格数据解析为结构化键值对(标题+对应条目列表)

轻浩姑娘_1323

轻浩姑娘_1323

发布时间:2026-10-07 22:34:21

|

230人浏览过

|

来源于php中文网

原创

如何用 Python 将网页表格数据解析为结构化键值对(标题+对应条目列表)

本文讲解如何使用 selenium 替代 requests + beautifulsoup,稳定抓取依赖 javascript 渲染的动态表格,并将“偶数行作标题、奇数行作内容”的交替结构自动转换为字典格式的结构化数据。

本文讲解如何使用 selenium 替代 requests + beautifulsoup,稳定抓取依赖 javascript 渲染的动态表格,并将“偶数行作标题、奇数行作内容”的交替结构自动转换为字典格式的结构化数据。

在网页爬虫实践中,许多现代网站(如 modernarmor.worldoftanks.com)采用 JavaScript 动态加载表格内容,导致 requests + BeautifulSoup 无法获取真实 DOM —— 这正是原代码始终无法正确提取表头与数据的根本原因。此时,Selenium 成为更可靠的选择:它通过真实浏览器驱动执行渲染,确保所有 <tr> 元素(包括 JS 注入的)均被完整加载。<p>以下是一个完整、健壮的解决方案:</p> <h3>✅ 核心逻辑说明</h3> <ul> <li>表格结构为严格交替:第 0、2、4… 行是分类标题(如 <code>"World War II: Battle Tiers 1-2"),第 1、3、5… 行是该分类下的地图名称列表(换行分隔);

  • 使用 WebDriverWait 确保元素加载完成,避免 NoSuchElementException;
  • 自动处理 Cookie 弹窗(如 OneTrust),提升脚本鲁棒性;
  • 最终输出为 dict[str, list[str]],天然支持后续导出 CSV、JSON 或 Pandas DataFrame。
  • ✅ 完整可运行代码

    from selenium.webdriver import Chrome
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    from selenium.webdriver.common.by import By
    import json
    
    URL = "https://modernarmor.worldoftanks.com/en/cms/guides/map-labels-tiers-eras/"
    
    def reject_cookies(driver):
        """点击 'Reject All' 按钮关闭 Cookie 提示(若存在)"""
        wait = WebDriverWait(driver, 3)
        try:
            button = wait.until(EC.element_to_be_clickable((By.ID, "onetrust-reject-all-handler")))
            button.click()
        except:  # 超时或元素不存在则跳过
            pass
    
    def scrape_map_labels(driver):
        """主解析函数:按行交替提取标题与地图列表"""
        wait = WebDriverWait(driver, 5)
        # 精确匹配表格行(基于实际页面 class)
        rows = wait.until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, "tr.news_post-widget-table-tr")))
    
        result = {}
        header = None
    
        for i, row in enumerate(rows):
            text = row.text.strip()
            if not text:  # 跳过空行
                continue
            if i % 2 == 0:  # 偶数索引 → 标题行
                header = text
            else:  # 奇数索引 → 数据行 → 按换行符切分为地图名列表
                if header and text:
                    result[header] = [item.strip() for item in text.split("\n") if item.strip()]
    
        return result
    
    # 启动浏览器并执行
    with Chrome() as driver:
        driver.get(URL)
        reject_cookies(driver)
        data = scrape_map_labels(driver)
    
    # 输出结构化结果(便于调试与后续处理)
    print(json.dumps(data, indent=2, ensure_ascii=False))

    ⚠️ 注意事项与优化建议

    • 驱动准备:需提前安装匹配版本的 ChromeDriver,或使用 webdriver-manager 自动管理(推荐):
      pip install webdriver-manager

      并替换 with Chrome() 为:

      python-pro
      python-pro

      高级 Python 特性、异步编程、性能调优、静态类型、内存管理、Python 内部机制及生态库方面的专家。

      下载
      from selenium.webdriver.chrome.service import Service
      from webdriver_manager.chrome import ChromeDriverManager
      with Chrome(service=Service(ChromeDriverManager().install())) as driver:
    • 反爬适配:若页面增加检测,可添加 options.add_argument("--headless=new") 静默运行,或设置 User-Agent;
    • 数据清洗增强:对 result[header] 中每个地图名,可追加 .replace(" [MERGE]", "") 或正则清理(如 re.sub(r'[^\w\s]', '', name));
    • 扩展用途:该字典可直接转为 Pandas DataFrame:
      import pandas as pd
      df = pd.DataFrame([(k, v) for k, vs in data.items() for v in vs], columns=["Era_Tier", "Map"])

    该方案摒弃了脆弱的字符串计数(如 stringCount == 2)和正则预处理,转而依托 DOM 结构本身进行语义化解析,显著提升可维护性与准确性。

    立即学习“Python免费学习笔记(深入)”;

    热门AI工具

    更多
    超级简历WonderCV

    一款AI办公效率工具,主要用于免费求职简历模版下载制作,应届生职场人必备简历制作神器,适合需要提升相关任务效率的用户。

    DeepSeek

    DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

    音述AI
    音述AI Hot

    一款AI音频处理工具,主要用于音述AI是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区,适合需要提升相关任务效率的用户。

    讯飞绘文

    讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

    WorkBuddy

    一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

    AionClaw
    AionClaw Hot

    AionClaw是一款面向办公、创作和编程任务的AI桌面智能体。

    PixPix
    PixPix Hot

    PixPix是一款面向电商视觉生产的AI商品图生成工具。

    豆包大模型

    豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

    LibLibAI
    LibLibAI Hot

    一款AI视频创作工具,主要用于国内领先的AI创意平台,以海量模型、低门槛操作与“创作-分享-商业化”生态,让小白与专业创作者都能高效实现图文乃至视频创意表达,适合需要提升相关任务效率的用户。

    相关专题

    更多
    python打包成可执行文件
    python打包成可执行文件

    本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

    1671

    2023.07.20

    python能做什么
    python能做什么

    python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

    4204

    2023.07.25

    format在python中的用法
    format在python中的用法

    Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

    1669

    2023.07.31

    python教程
    python教程

    Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

    24337

    2023.08.03

    python环境变量的配置
    python环境变量的配置

    Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

    2967

    2023.08.04

    python eval
    python eval

    eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

    3007

    2023.08.04

    scratch和python区别
    scratch和python区别

    scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

    1163

    2023.08.11

    python合并两个列表
    python合并两个列表

    Python是一种强大的编程语言,具有许多方便的功能和工具。在Python中,有多种方法可以合并两个列表。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

    596

    2023.08.10

    FrankenPHP集成Laravel详细教程
    FrankenPHP集成Laravel详细教程

    本专题提供FrankenPHP集成Laravel的详细配置指南,全面解析运行原理、开发环境搭建、Caddyfile配置、Octane工作模式、数据库连接、队列任务、定时任务和生产环境优化,解决部署过程中常见的报错与兼容性问题。

    0

    2026.10.08

    热门下载

    更多
    网站特效
    /
    网站源码
    /
    网站素材
    /
    前端模板

    精品课程

    更多
    相关推荐
    /
    热门推荐
    /
    最新课程
    关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
    php中文网:公益在线php培训,帮助PHP学习者快速成长!
    关注服务号
    PHP中文网订阅号
    每天精选资源文章推送

    Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn