Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >Python -从复杂的HTML中自动抓取表格

我正在尝试自动从网站上的每个表格中抓取所有数据,并将每个表格输出到excel中的选项卡中。

我一直在使用https://www.thepythoncode.com/article/convert-html-tables-into-csv-files-in-pythonhttps://towardsdatascience.com/web-scraping-html-tables-with-python-c9baba21059Python - Web Scraping HTML table and printing to CSV等问题中目前可用的代码。

在使用这个URL时,我很难同时提取底层数据和表头。HTML格式非常密集,这使得我很难以正确的结构提取表。

我当前的代码:

代码语言:javascript
运行
AI代码解释
复制
from bs4 import BeautifulSoup as bs
from urllib.request import urlopen
import re
import html2text
import requests
import pandas as pd

USER_AGENT = "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.157 Safari/537.36"
# US english
LANGUAGE = "en-US,en;q=0.5"

def get_soup(url):
    """Constructs and returns a soup using the HTML content of `url` passed"""
    # initialize a session
    session = requests.Session()
    # set the User-Agent as a regular browser
    session.headers['User-Agent'] = USER_AGENT
    # request for english content (optional)
    session.headers['Accept-Language'] = LANGUAGE
    session.headers['Content-Language'] = LANGUAGE
    # make the request
    html = session.get(url)
    # return the soup
    return bs(html.content, "html.parser")

def get_all_tables(soup):
    """Extracts and returns all tables in a soup object"""
    return soup.find_all("table")

def get_table_headers(table):
    """Given a table soup, returns all the headers"""
    headers = []
    for th in table.find("tr").find_all("th"):
        headers.append(th.text.strip())
    return headers

def get_table_rows(table):
    """Given a table, returns all its rows"""
    rows = []
    for tr in table.find_all("tr")[1:]:
        cells = []
        # grab all td tags in this table row
        tds = tr.find_all("td")
        if len(tds) == 0:
            # if no td tags, search for th tags
            # can be found especially in wikipedia tables below the table
            ths = tr.find_all("th")
            for th in ths:
                cells.append(th.text.strip())
        else:
            # use regular td tags
            for td in tds:
                cells.append(td.text.strip())
        rows.append(cells)
    return rows

def save_as_csv(table_name, headers, rows):
    pd.DataFrame(rows, columns=headers).to_csv(f"{table_name}.csv")

def main(url):
    # get the soup
    soup = get_soup(url)
    # extract all the tables from the web page
    tables = get_all_tables(soup)
    print(f"[+] Found a total of {len(tables)} tables.")
    # iterate over all tables
    for i, table in enumerate(tables, start=1):
        # get the table headers
        headers = get_table_headers(table)
        # get all the rows of the table
        rows = get_table_rows(table)
        # save table as csv file
        table_name = f"table-{i}"
        print(f"[+] Saving {table_name}")
        save_as_csv(table_name, headers, rows)

main("https://www.sec.gov/Archives/edgar/data/1701605/000170160519000089/bkr-2019093010xq.htm")

例如,我需要代码来识别一个表,如所附图像中的表,并将所有信息放入excel格式。

来自Extract HTML Tables With Similar Data from Different Sources with Different Formatting - PythonExtract HTML Table Based on Specific Column Headers - Python等问题的代码能够搜索网址,但寻找的标准太具体了,因为我需要网址中的所有表。

任何帮助都将不胜感激!我确信有一个我看不到的优雅的解决方案

EN

回答 1

Stack Overflow用户

发布于 2020-04-15 20:37:23

我看了一下。你文章中的网址在很大程度上依赖于JavaScript来用它的元素填充页面。这就是为什么BeautifulSoup看不到它。模板HTML有12个表,它们最初看起来都是这样的:

代码语言:javascript
运行
AI代码解释
复制
<table class="table table-striped table-sm">
    <tbody id="form-information-modal-carousel-page-1">
        <!-- Below is populated dynamically VIA JS -->
            <tr>
                <td class="text-center">
                    <i class="fas fa-spinner fa-spin"></i>
                </td>
            </tr>
    </tbody>
</table>
</div>
<div class="carousel-item table-responsive">
    <table class="table table-striped table-bordered table-sm">
        <tbody id="form-information-modal-carousel-page-2">
            <!-- Below is populated dynamically VIA JS -->
            ...

请注意注释<!-- Below is populated dynamically VIA JS -->。基本上,所有有趣的数据都没有放到这个HTML中。我记录了我的网络流量,页面发出了两个XHR请求。其中一个看起来很有前途,那就是MetaLinks.json。它很大,但不幸的是表数据不在其中(仍然很感兴趣,可能对其他事情有用)。另一个XHR资源是一个实际的HTML文档,其中包含内置的表格数据。JSON会更好,因为我们不需要使用BeautifulSoup来解析它,但不管怎样。顺便说一句,这就是我们真正想要抓取的HTML。我们不想抓取您提供的URL (交互式内联XBRL查看器)-它实际上使用HTML XHR资源来填充自己。这个HTML与您单击左上角的内联XBRL查看器的汉堡菜单并选择"Open as HTML“时查看的是同一个HTML。如果您在查找时遇到困难,可以使用以下网址:https://www.sec.gov/Archives/edgar/data/1701605/000170160519000089/bkr-2019093010xq.htm

编辑-这里有一个小例子。我只是从表格中找出一些数字:

代码语言:javascript
运行
AI代码解释
复制
def main():

    import requests
    from bs4 import BeautifulSoup

    url = "https://www.sec.gov/Archives/edgar/data/1701605/000170160519000089/bkr-2019093010xq.htm"

    response = requests.get(url, headers={})
    response.raise_for_status()

    soup = BeautifulSoup(response.content, "html.parser")

    for table in soup.find_all("table"):
        for row in table.find_all("tr"):
            for data in row.find_all("ix:nonfraction"):
                print(data.text, end=" ")
            print()
        print()


    return 0


if __name__ == "__main__":
    import sys
    sys.exit(main())

输出:

代码语言:javascript
运行
AI代码解释
复制
3,339 3,142 9,886 9,421 
2,543 2,523 7,604 7,191 
5,882 5,665 17,490 16,612 


2,901 2,819 8,647 8,371 
1,880 1,873 5,705 5,491 
679 608 2,083 1,944 
71 66 183 374 
54 17 128 113 
5,585 5,383 16,746 16,293 
297 282 744 319 
14 6 124 51 
59 55 174 164 
224 233 446 20685139 
107 110 269 86 
117 38 177 19 
60 25 97 83 
57 13 80 64 
...

输出结果实际上比我所展示的要长得多,但是您可以理解其中的意思。此外,我不会从表中提取所有相关数字,因为我只查看ix:nonfraction标记,但还有其他类型(例如,十进制数字)。超文本标记语言真的很密集--你必须弄清楚如何从每一行中获取所有其他字段,处理非ix:nonfraction标记,处理空列等。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61234991

复制
相关文章
C++ GPU && CPU
1 #include <amp.h> 2 3 #include <iostream> 4 5 #include <winbase.h> //操作系统的底层文件 6 7 8 9 using namespace concurrency; 10 11 using namespace std; 12 13 14 15 void main () { 16 17 18 19 20 21 int a [] = {1 ,2, 3,4 ,5, 6
Gxjun
2018/03/26
7390
PyTorch 1.7 发布! 支持CUDA 11,Windows 分布式训练,以及FFT新API
今天,我们正式发布 PyTorch 1.7,以及升级的域库。PyTorch 1.7版本包括了一些新的 API,比如对兼容 numpy 的 FFT 操作的支持、性能分析工具以及对分布式数据并行(DDP)和基于远程过程调用(RPC)的分布式训练的重要更新。此外,还有一些特性移到了 stable 状态,包括自定义 C++ 类、内存分析器、通过自定义类张量对象实现的扩展、 RPC 中的用户异步函数以及 torch.distributed 中的其他一些特性,如 Per-RPC 超时、 DDP dynamic bucketing 和 RRef helper。
McGL
2020/10/30
1.1K0
[开发技巧]·PyTorch如何使用GPU加速(CPU与GPU数据的相互转换)
在进行深度学习开发时,GPU加速可以提升我们开发的效率,速度的对比可以参照笔者这篇博文:[深度应用]·主流深度学习硬件速度对比(CPU,GPU,TPU)结论:通过对比看出相较于普通比较笔记本的(i5 8250u)CPU,一个入门级显卡(GPU MX150)可以提升8倍左右的速度,而高性能的显卡(GPU GTX1080ti)可以提升80倍的速度,如果采用多个GPU将会获得更快速度,所以经常用于训练的话还是建议使用GPU。
小宋是呢
2019/06/27
35.5K1
PyTorch 1.5上线:加入稳定C++前端,高级自动梯度API
今天,PyTorch 1.5 宣布上线,此版本主要包括几个新的 API 的添加和改进。新版 PyTorch 包括对 C++前端的重大更新,用于计算机视觉模型的「channels last」存储格式,以及用于模型并行训练的分布式 RPC 框架的稳定版本。该版本还提供了针对自动求导机制中黑塞和雅可比的新 API,以及受 pybind 启发,允许用户创建自定义 C++类的一个 API。另外,torch_xla 已可在 PyTorch 1.5 版中使用,并在 1.5 版本中进行了测试,可提供成熟的 Cloud TPU 体验。
机器之心
2020/04/23
5660
PyTorch 1.7来了:支持Windows上的分布式训练,还有大波API袭来
据Facebook 官方博客公告,PyTorch1.7版本已经于昨日正式发布,相比于以往的 PyTorch 版本,此次更新除了增加了更多的API,还能够支持 NumPy兼容下的傅里叶变换、性能分析工具,以及对基于分布式数据并行(DDP)和远程过程调用(RPC)的分布式训练。
AI科技评论
2020/11/06
1.3K0
PyTorch 1.7来了:支持Windows上的分布式训练,还有大波API袭来
PyTorch 1.7来了:支持Windows上的分布式训练,还有大波API袭来
据Facebook 官方博客公告,PyTorch1.7版本已经于昨日正式发布,相比于以往的 PyTorch 版本,此次更新除了增加了更多的API,还能够支持 NumPy兼容下的傅里叶变换、性能分析工具,以及对基于分布式数据并行(DDP)和远程过程调用(RPC)的分布式训练。
AI算法与图像处理
2020/11/06
1.2K0
PyTorch 1.7来了:支持Windows上的分布式训练,还有大波API袭来
[源码解析] PyTorch 如何使用GPU
在 PyTorch DataParallel 训练过程中,其会在多个GPU之上复制模型副本,然后才开始训练。笔者在分析过程中,发现如果不把一些GPU相关基础知识整理出来,很难理解DataParallel的这个复制模型的过程,遂有此文。
罗西的思考
2021/11/10
3.4K0
GPU VS CPU
安装TensorFlow GPU版本 !pip install tensorflow-gpu Collecting tensorflow-gpu [?25l Downloading https://
用户3577892
2020/06/11
5560
PyTorch 2.0 重磅发布:编译、编译、还是编译!
内容一览:昨晚召开的 PyTorch Conference 2022 中,官方正式发布了 PyTorch 2.0。本文将梳理 PyTorch 2.0 与 1.x 相比的最大差异。
HyperAI超神经
2023/02/27
1.5K0
PyTorch 2.0 重磅发布:编译、编译、还是编译!
PyTorch 1.12发布,正式支持苹果M1芯片GPU加速,修复众多Bug
点击上方↑↑↑“OpenCV学堂”关注我来源:公众号 机器之心  授权 PyTorch 1.12 正式发布,还没有更新的小伙伴可以更新了。 距离 PyTorch 1.11 推出没几个月,PyTorch 1.12 就来了!此版本由 1.11 版本以来的 3124 多次 commits 组成,由 433 位贡献者完成。1.12 版本进行了重大改进,并修复了很多 Bug。 随着新版本的发布,大家讨论最多的可能就是 PyTorch 1.12 支持苹果 M1 芯片。 其实早在今年 5 月,PyTorch 官方就已经
OpenCV学堂
2022/07/04
9150
PyTorch 1.12发布,正式支持苹果M1芯片GPU加速,修复众多Bug
开发 | 用PyTorch还是TensorFlow?斯坦福大学CS博士生带来全面解答
AI 科技评论按:关于深度学习的框架之争一直没有停止过。PyTorch,TensorFlow,Caffe还是Keras ?近日, 斯坦福大学计算机科学博士生Awni Hannun就发表了一篇文章,对比当前两个主流框架PyTorch和TensorFlow。 AI 科技评论编译如下: 这篇指南是我目前发现的PyTorch和TensorFlow之间的主要差异。写这篇文章的目的是想帮助那些想要开始新项目或者转换深度学习框架的人进行选择。文中重点考虑训练和部署深度学习堆栈组件时框架的可编程性和灵活性。我不会权衡速度、
AI科技评论
2018/03/13
1.8K0
PyTorch 1.0 中文官方教程:使用 PyTorch C++ 前端
PyTorch C++ 前端 是PyTorch机器学习框架的一个纯C++接口。PyTorch的主接口是Python,Python API位于一个基础的C++代码库之上,提供了基本的数据结构和功能,例如张量和自动求导。C++前端暴露了一个纯的C++11的API,在C++底层代码库之上扩展了机器学习训练和推理所需的工具扩展。这包括用于神经网络建模的内置组件集合;扩展此集合的自定义模块API;流行的优化算法库(如随机梯度下降);使用API定义和加载数据集的并行数据加载程序;序列化例行程序等等。
ApacheCN_飞龙
2022/05/07
6750
PyTorch如何加速数据并行训练?分布式秘籍大揭秘
在芯片性能提升有限的今天,分布式训练成为了应对超大规模数据集和模型的主要方法。本文将向你介绍流行深度学习框架 PyTorch 最新版本( v1.5)的分布式数据并行包的设计、实现和评估。
机器之心
2020/07/14
1.1K0
PyTorch如何加速数据并行训练?分布式秘籍大揭秘
清华自研深度学习框架「计图」开源!多项任务性能超过PyTorch
刚刚,清华自研的深度学习框架,正式对外开源。“贵系”计算机系的图形实验室出品,取名Jittor,中文名计图。
量子位
2020/03/31
4870
清华自研深度学习框架「计图」开源!多项任务性能超过PyTorch
PyTorch如何加速数据并行训练?分布式秘籍大揭秘
在芯片性能提升有限的今天,分布式训练成为了应对超大规模数据集和模型的主要方法。本文将向你介绍流行深度学习框架 PyTorch 最新版本( v1.5)的分布式数据并行包的设计、实现和评估。
CV君
2020/07/17
9340
PyTorch如何加速数据并行训练?分布式秘籍大揭秘
PyTorch如何加速数据并行训练?分布式秘籍大揭秘
在芯片性能提升有限的今天,分布式训练成为了应对超大规模数据集和模型的主要方法。本文将向你介绍流行深度学习框架 PyTorch 最新版本( v1.5)的分布式数据并行包的设计、实现和评估。
代码医生工作室
2020/07/17
9030
PyTorch如何加速数据并行训练?分布式秘籍大揭秘
Pytorch 最全入门介绍,Pytorch入门看这一篇就够了
本文通过详细且实践性的方式介绍了 PyTorch 的使用,包括环境安装、基础知识、张量操作、自动求导机制、神经网络创建、数据处理、模型训练、测试以及模型的保存和加载。
TechLead
2023/10/21
6.5K0
Pytorch 最全入门介绍,Pytorch入门看这一篇就够了
在 Python 中将数值变量转换为分类变量
这篇文章是今天发布的CTGAN的补充,我们可以使用pandas的cut函数将数据进行离散化、将连续变量进行分段汇总,这比写自定义函数要简单的多。
deephub
2021/11/16
2.2K0
Python中将字典转为成员变量
当我们在Python中写一个class时,如果有一部分的成员变量需要用一个字典来命名和赋值,此时应该如何操作呢?这个场景最常见于从一个文件(比如json、npz之类的文件)中读取字典变量到内存当中,再赋值给一个类的成员变量,或者已经生成的实例变量。
DechinPhy
2022/05/10
1.4K0
点击加载更多

相似问题

如何在pytorch中从gpu返回cpu?

340

PyTorch (GPU)比CPU慢

13

在Pytorch中从GPU/CPU中删除模型

10

Pytorch CPU和GPU并行运行

115

Pytorch-GPU我忘了把什么移到GPU上?

294
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文