使用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 脚本来从任何网站提取任何表,尝试传递其他 URL 并查看它是否有效。
Python将HTML表格转换为CSV文件?对于 Javascript 驱动的网站(使用 Javascript 动态加载网站数据),请尝试使用requests-html库或selenium。让我们看看你在下面的评论中做了什么!
你还可以制作一个从整个网站下载所有表格的网络爬虫,你可以通过提取所有网站链接并在你从中获得的每个 URL 上运行此脚本来实现这一点。
此外,如果出于某种原因,你正在抓取的网站阻止了你的 IP 地址,你需要使用一些代理服务器作为对策。