如何在Python中将HTML表格转换为CSV文件?代码示例

2021年11月16日18:49:24 发表评论 1,038 次浏览

使用requests和beautiful soup提取 HTML 表,然后将其保存为 CSV 文件或任何其他格式的 Python。

Python将HTML表格转换为CSV文件?你是否曾经想从网页中自动提取 HTML 表格并将它们以适当的格式保存在你的计算机中?如果是这种情况,那么你来对地方了,在本教程中,我们将使用请求BeautifulSoup库来转换任何网页中的任何表格并将其保存在我们的磁盘中。

Python如何将HTML表格转为CSV?我们还将使用Pandas轻松转换为CSV格式(或Pandas支持的任何格式)。如果你还没有安装requests、BeautifulSoup和pandas,请使用以下命令安装它们:

pip3 install requests bs4 pandas

Python将HTML表格转为CSV示例介绍 - 打开一个新的 Python 文件并继续,让我们导入库:

import requests
import pandas as pd
from bs4 import BeautifulSoup as bs

我们需要一个接受目标 URL 的函数,并为我们提供正确的soup对象:

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")

Python如何将HTML表格转为CSV?我们首先初始化了一个请求会话,我们使用User-Agent标头来表明我们只是一个普通浏览器而不是机器人(一些网站阻止了它们),然后我们使用session.get()方法获取 HTML 内容。之后,我们使用html.parser构造一个BeautifulSoup对象。

相关教程: 如何在 Python 中制作电子邮件提取器。

Python将HTML表格转换为CSV文件?由于我们想要提取任何页面中的每个表格,我们需要找到表格HTML 标记并返回它,以下函数正是这样做的:

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

上述函数查找表的第一行并提取所有第th 个标签(表头)。

现在我们知道如何提取表头,剩下的就是提取所有表行:

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

上面的所有函数都是做的,就是找到tr标签(表行)并提取td元素,然后将它们附加到列表中。我们使用table.find_all("tr")[1:]而不是所有tr标签的原因是因为第一个tr标签对应于表头,我们不想在这里添加它。

Python将HTML表格转换为CSV文件?下面的函数获取表名、表头和所有行,并将它们保存为CSV格式:

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)

Python如何将HTML表格转为CSV?上述函数执行以下操作:

  • 通过构造BeautifulSoup对象,解析给定 URL 的网页的 HTML 内容。
  • 查找该 HTML 页面中的所有表格。
  • 遍历所有这些提取的表并一一保存。

Python将HTML表格转为CSV示例 - 最后,让我们调用 main 函数:

if __name__ == "__main__":
    import sys
    try:
        url = sys.argv[1]
    except IndexError:
        print("Please specify a URL.\nUsage: python html_table_extractor.py [URL]")
        exit(1)
    main(url)

这将接受来自命令行参数的 URL,让我们试试这是否有效:

C:\pythoncode-tutorials\web-scraping\html-table-extractor>python html_table_extractor.py https://en.wikipedia.org/wiki/List_of_countries_and_dependencies_by_population
[+] Found a total of 2 tables.
[+] Saving table-1
[+] Saving table-2

很好,我当前目录中出现了两个CSV文件,它们对应于该 Wikipedia 页面中的两个表,这是提取的其中一个表的一部分:

如何在Python中将HTML表格转换为CSV文件?代码示例
Python如何将HTML表格转为CSV

惊人的 !我们已经成功构建了一个 Python 脚本来从任何网站提取任何表,尝试传递其他 URL 并查看它是否有效。

Python将HTML表格转换为CSV文件?对于 Javascript 驱动的网站(使用 Javascript 动态加载网站数据),请尝试使用requests-html库或selenium。让我们看看你在下面的评论中做了什么!

你还可以制作一个从整个网站下载所有表格的网络爬虫,你可以通过提取所有网站链接并在你从中获得的每个 URL 上运行此脚本来实现这一点。

此外,如果出于某种原因,你正在抓取的网站阻止了你的 IP 地址,你需要使用一些代理服务器作为对策。

木子山

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: