网页表格抓取(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地址,你需要使用一些代理服务器作为对策。

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线