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

Python -从复杂的HTML中自动抓取表格
EN

Stack Overflow用户
提问于 2020-04-15 17:33:28
回答 1查看 1.4K关注 0票数 0

我正在尝试自动从网站上的每个表格中抓取所有数据,并将每个表格输出到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

复制
相关文章
(二)html 复杂表格
---- <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <title>程序员之美</title> <meta charset="utf-8" /> <style type="text/css"> /*表格样式*/ table { width: 90%; back
花狗Fdog
2020/11/03
2.5K0
(二)html 复杂表格
python生成html表格
最近做一个小工具,需要将统计数据生成html表格。在网上搜罗一圈后发现用pandas生成表格非常好用。代码如下:
py3study
2020/01/13
7.2K0
网站抓取引子 - 获得网页中的表格
爬虫是都不陌生的一个概念,比如百度、谷歌都有自己的爬虫工具去抓取网站、分析、索引,方便我们的查询使用。 在我们浏览网站、查询信息时,如果想做一些批量的处理,也可以去分析网站的结构、抓取网页、提取信息,然后就完成了一个小爬虫的写作。 网页爬虫需要我们了解URL的结构、HTML语法特征和结构,以及使用合适的抓取、解析工具。我们这篇先看一个简单的处理,给一个直观的感受:一个函数抓取网页的表格。以后再慢慢解析如何更加定制的获取信息。 HMDB (人类代谢组数据库)收录了很多代谢组的数据,用于代谢组学、临床化学、生物
生信宝典
2018/02/05
3.1K0
网站抓取引子 - 获得网页中的表格
HTML表格中<td scope="col">与<td scope="row">的含义
HTML表格中<td scope="col">与<td scope="row">的含义
wfaceboss
2019/04/08
2.4K0
html中表格整体居中,html中怎么把表格居中
html中把表格居中的方法:首先创建一个HTML示例文件;然后使用table标签创建一个两行两列的表格;接着给table标签添加一个class属性;最后将margin属性设置为“0 auto”即可。
全栈程序员站长
2022/07/22
14.6K0
html中表格整体居中,html中怎么把表格居中
抓取html页面中的json数据
抓取html页面中的json数据
Java架构师必看
2021/08/03
3.3K0
Python 抓取邮件中表格到Excel
上代码 import imapclient # 这个包导不进来,先导入 pyzmail36,下载好后再改回 pyzmail 即可 import pyzmail from bs4 import BeautifulSoup import pandas as pd import xlsxwriter import html5lib # 提取邮件里面的表格 class my_eamil(): """ 构造函数,创建一个类的入口 self指的是类实例对象本身
Java架构师必看
2021/08/09
1.3K0
Python用列表生成html表格
Python用列表生成html表格 d = { 'Adam': 95, 'Lisa': 85, 'Bart': 59 } def generate_tr(name, score): if score < 60: #如果小于60分,表格输出时标红 return '<tr><td>%s</td><td style="color:red">%s</td></tr>'% (name,score) else: return '<tr><td>%s</td><td>%s
py3study
2020/01/13
3.2K0
python爬虫图片抓取(python从网络上抓取照片)
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/128295.html原文链接:https://javaforall.cn
全栈程序员站长
2022/07/28
1.6K0
python爬虫图片抓取(python从网络上抓取照片)
Python自动化邮件添加HTML表格图像和Excel附件
wb = load_workbook(fileName,data_only=True)
沈宥
2022/05/09
6250
Python自动化邮件添加HTML表格图像和Excel附件
html表格
<table>、<tr>和<td>是HTML表格最基本的3个标签,其他标题标签<caption>、表头单元格<th>可以没有,但是这3者必须要有。
Qwe7
2022/05/16
4.1K0
Html 表格
看了上图百度的搜索页面,有木有心动一下,别慌你也能够的。这就是我们今天要讲的表单。
全栈程序员站长
2022/07/05
3.3K0
Html 表格
HTML表格
            4.cellspacing:外边距(单元格和单元格之间的距离)
十月梦想
2018/08/29
4.1K0
HTML表格代码_html如何制作表格代码
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/169633.html原文链接:https://javaforall.cn
全栈程序员站长
2022/09/22
14.9K0
七 .Html的表格
1.表格 owspan 纵向的合并单元格 colspan 横向的合并单元格 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Docume
小海怪的互联网
2020/10/26
2.1K0
Python 自动整理 Excel 表格
相信有不少朋友日常工作会用到 Excel 处理各式表格文件,更有甚者可能要花大把时间来做繁琐耗时的表格整理工作。最近有朋友问可否编程来减轻表格整理工作量,今儿我们就通过实例来实现 Python 对表格的自动化整理。
数据森麟
2019/11/29
1.1K0
Python 自动整理 Excel 表格
相信有不少朋友日常工作会用到 Excel 处理各式表格文件,更有甚者可能要花大把时间来做繁琐耗时的表格整理工作。最近有朋友问可否编程来减轻表格整理工作量,今儿我们就通过实例来实现 Python 对表格的自动化整理。
一墨编程学习
2019/08/20
1.6K0
Python 自动整理 Excel 表格
相信有不少朋友日常工作会用到 Excel 处理各式表格文件,更有甚者可能要花大把时间来做繁琐耗时的表格整理工作。最近有朋友问可否编程来减轻表格整理工作量,今儿我们就通过实例来实现 Python 对表格的自动化整理。
短短的路走走停停
2019/07/30
2.2K0
Python 自动整理 Excel 表格
html代码大全表格_html表格代码怎么写
在做前台html中我们经常用到一些表格,苦逼的后台程序猿大多都简简单单的写一些标签,下面分享一下只用h5就能写出一些精美的form
全栈程序员站长
2022/09/22
7.9K0
点击加载更多

相似问题

VBA HTML表格抓取-特定于复杂表格的原始数据

111

我可以在Python中从html文件中抓取表格吗?

112

用Python从网页中抓取表格

43

HTML复杂表格

20

Python从网站上抓取表格?

012
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

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

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文