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

使用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 上运行此脚本来实现这一点。
【如何在Python中将HTML表格转换为CSV文件(代码示例)】此外,如果出于某种原因,你正在抓取的网站阻止了你的 IP 地址,你需要使用一些代理服务器作为对策。

    推荐阅读