网页表格抓取(Python将表格转换为CSV文件?你是否曾经想从网页中自动提取Python)
优采云 发布时间: 2021-11-19 04:04网页表格抓取(Python将表格转换为CSV文件?你是否曾经想从网页中自动提取Python)
使用requests和beautiful Soup提取HTML表格,然后将其保存为CSV文件或任何其他格式的Python。
Python 将 HTML 表格转换为 CSV 文件?您是否曾经想从网页中自动提取 HTML 表格并将它们以适当的格式保存在您的计算机上?如果是这种情况,那么您来对地方了。在本教程中,我们将使用 requests 和 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 并为我们提供正确的汤对象:
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?上述函数执行以下操作:
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文件,它们对应维基百科页面中的两个表,它们是提取表之一的一部分:
如何在 Python 中将 HTML 表格转换为 CSV
惊人!我们已经成功构建了一个 Python 脚本来从任何 网站 中提取任何表,尝试传递其他 URL 并查看它是否有效。
Python 将 HTML 表格转换为 CSV 文件?对于Javascript驱动的网站(使用Javascript动态加载网站数据),请尽量使用requests-html库或selenium。让我们看看你在下面的评论中做了什么!
您还可以制作一个从整个 网站 下载所有表单的网络爬虫,您可以通过提取所有 网站 链接并在从它们获得的每个 URL 上运行此脚本来实现此目的。
另外,如果你正在爬取的网站由于某种原因阻塞了你的IP地址,你需要使用一些代理服务器作为对策。