Python抓取HTML表格数据:使用Requests和Beautiful Soup快速解析与提取

翻译:李·鲁伊

Python抓取HTML表格数据:使用Requests和Beautiful Soup快速解析与提取

表格数据是网络上最好的数据源之一。他们可以存储很多有用的信息而不会丢失易于阅读的格式,从而使其成为与数据相关的项目的金矿。

无论是爬行足球比赛数据还是提取股票市场数据,您都可以使用Python快速访问,解析和从HTML表中提取数据,这要归功于请求和美丽的汤。

了解HTML表的结构

从视觉上讲,HTML表是一组行和列,它们以表格格式显示信息。本文主要介绍如何爬网数据:

为了能够抓取此表中包含的数据,需要在编码中对其进行更深入的研究。

一般而言,HTML表实际上是使用以下HTML标签构建的:

但是,正如人们在实际情况下可以看到的那样,并非所有开发人员在构建桌子时都遵循这些惯例,这使某些项目比其他项目更难。但是,了解它们的工作方式对于找到正确的方法至关重要。

在浏览器中输入表的URL,然后检查页面以查看底部发生的事情。

这就是为什么此页面非常适合练习Python中的爬行表数据的原因。有一个明确的标签对打开和关闭表,所有相关数据都在标签中。它仅显示10行与前端选择的条目数量匹配。

关于这张表有一些事情要知道,也就是说,有57个条目可以爬网,似乎有两种解决方案可以访问数据。第一个是单击下拉菜单,然后选择“ 100”以显示所有条目:

或单击下一个按钮浏览页面。

那么哪种解决方案会更好?两种解决方案都为脚本增加了额外的复杂性,因此首先检查在哪里提取数据。

当然,由于这是一个HTML表,因此所有数据都应在HTML文件本身上,而无需注入AJAX。要验证这一点,您需要右键单击>查看页面源。接下来,复制一些单元格,然后在源代码中搜索它们。

在来自不同分页单元的多个条目上执行了相同的操作,尽管前端没有显示,但似乎所有目标数据都在其中。

有了这些信息,您可以开始编写代码。

使用Python的美丽汤删除HTML桌子

因为所有要检索的员工数据都在HTML文件中,因此您可以使用请求库发送HTTP请求并使用美丽的汤来解析响应。

注意:对于Web Crawling的新手,本文的作者为Python教程的初学者创建了网络爬行教程。尽管新手可以学习,即使他们没有经验,但从基础知识开始总是一个好主意。

1。发送主要请求

在此项目中创建一个名为Python-Html-table的新目录,然后创建一个名为BS4-Table-Scraper的新文件夹,最后创建一个新的Python_table_scraper.py文件。

从终端PIP3安装请求,并将其导入到项目中:

复制

import requests  from bs4 import BeautifulSoup1.2.

要随请求发送HTTP请求,您需要做的就是设置一个URL并通过request.get.Get()将其传递,将返回的HTML存储在响应变量中,并输出响应响应。STATUS_CODE。

注意:如果您完全不熟悉Python,则可以使用命令python3python_table_scraper.py从终端运行代码。

复制

url = 'https://datatables.net/examples/styling/stripe.html'   response = requests.get(url)   print(response.status_code)1.2.3.

如果有效,将返回200个状态代码。任何其他情况都意味着IP被网站设定的反爬行系统拒绝。潜在的解决方案是将自定义标题添加到脚本中,以使脚本看起来更加用户友好,但这可能还不够。另一个解决方案是使用Web Crawl API处理所有这些复杂问题。

2。使用美丽的汤制造解析器

在提取数据之前,需要将原始HTML转换为格式化或解析数据。如下所示,将解析的HTML存储到汤对象中:

复制

soup = BeautifulSoup(response.text, 'html.parser')1.

从这里,您可以使用HTML标签及其属性横穿解析树。

如果您返回页面上的表格,并且您已经看到该表位于标签之间使用类Stripe DataTable封装,则可以使用它来选择该表。

复制

table = soup.find('table', class_ = 'stripe')  print(table)1.2.

注意:测试后,添加第二类(DataTable)不会返回元素。实际上,在返回元素中,表的类只是一个条纹。您也可以使用ID ='示例'。

这是它返回的结果:

复制

Table Return1.

现在已经检索了表,您可以穿越行并获取所需的数据。

3。通过HTML表迭代

回想HTML表的结构,每行均由一个元素表示,其中包含数据,所有元素都包裹在标签对之间。

为了提取数据,创建了两个外观,一个用于爬行表的一部分(所有行都位于位置),另一个用于将所有行存储到可以使用的变量中:

复制

for employee_data in table.find_all('tbody'):   rows = employee_data.find_all('tr')   print(rows)1.2.3.

在该行中,在表体部分中发现的所有元素都存储。如果您遵循此逻辑,下一步是将每一行存储到一个对象中,然后循环通过它们来查找所需的数据。

首先,尝试使用.querySelectorall()方法在浏览器控制台上选择第一个员工的名称。这种方法的一个真正有用的功能是,可以越来越深入地实现大于(>)符号的层次结构以定义父元素(左侧)和要获得的子元素(右图)。

复制

document.querySelectorAll('table.stripe > tbody > tr > td')[0]1.

如上所述,一旦所有元素被爬行,这些元素就会成为节点的列表。由于您不能依靠类获取每个单元格,因此您只需要知道它们在索引中的位置,而名字为0。

从那里,您可以写这样的代码:

复制

for row in rows:     name = row.find_all('td')[0].text     print(name)1.2.3.

简而言之,一一将每一行并找到其中的所有单元格。有一个列表后,只需在索引中获取第一个单元格(位置0),然后使用.TEXT方法仅获取元素的文本,然后忽略它。需要HTML数据。

这是所有员工名称的列表!对于其余的,只需遵循相同的逻辑:

复制

position = row.find_all('td')[1].text  office = row.find_all('td')[2].text  age = row.find_all('td')[3].text  start_date = row.find_all('td')[4].text  salary = row.find_all('td')[5].text1.2.3.4.5.

但是,将所有这些数据在控制台上获取无济于事。相反,这些数据可以存储在新的,更有用的格式中。

4.将表数据存储到JSON文件中

虽然可以很容易地创建一个CSV文件并将数据发送到此处,但是如果您可以用爬行的数据创建新的东西,那么这将不是最容易管理的格式。

但是,以前的项目解释了如何创建CSV文件来存储爬行的数据。

好消息是,Python有自己的JSON模块来处理JSON对象,因此无需安装任何程序,只需将其导入即可。

复制

import json1.

但是,在进行和创建JSON文件之前,您需要将所有这些爬网数据转换为列表。为此,在循环外创建一个空数组。

复制

employee_list = []1.

然后将数据附加到它,每个循环将一个新对象附加到数组。

复制

employee_list.append({    'Name': name,    'Position': position,    'Office': office,    'Age': age,    'Start date': start_date,    'salary': salary })1.

如果print(employee_list),则结果如下:

复制

Employee_List1.

仍然有些混乱,但已经准备好将一组对象转换为JSON。

注意:作为测试,输出返回57的员工_list的长度,这是要获取的正确行数(行现在是数组中的对象)。

仅需两行代码即可将列表导入JSON:

复制

with open('json_data', 'w') as json_file:    json.dump(employee_list, json_file, indent=2)1.2.

5。运行脚本并完成代码

如果您不断遵循以下方法,则代码库应如下所示:

复制

#dependencies  import requests  from bs4 import BeautifulSoup  import json   url = 'http://api.scraperapi.com?api_key=51e43be283e4db2a5afbxxxxxxxxxxx&url=https://datatables.net/examples/styling/stripe.html'   #empty array  employee_list = []   #requesting and parsing the HTML file  response = requests.get(url)  soup = BeautifulSoup(response.text, 'html.parser')   #selecting the table  table = soup.find('table', class_ = 'stripe')  #storing all rows into one variable  for employee_data in table.find_all('tbody'):    rows = employee_data.find_all('tr')    #looping through the HTML table to scrape the data    for row in rows:        name = row.find_all('td')[0].text        position = row.find_all('td')[1].text        office = row.find_all('td')[2].text        age = row.find_all('td')[3].text        start_date = row.find_all('td')[4].text        salary = row.find_all('td')[5].text        #sending scraped data to the empty array        employee_list.append({            'Name': name,            'Position': position,            'Office': office,            'Age': age,            'Start date': start_date,            'salary': salary        })  #importing the array to a JSON file  with open('employee_data', 'w') as json_file:    json.dump(employee_list, json_file, indent=2)1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.31.32.33.34.35.

注意:这是现场的一些评论。

这是JSON文件中的前三个对象:

以JSON格式存储爬网数据允许在新应用程序中使用信息。

使用熊猫爬网html表

在离开页面之前,我希望探索第二种方法来爬网表。只需几行代码,您就可以从HTML文档中获取所有表格数据,并使用PANDA将其存储在数据框架中。

在项目目录(名称panda-html-table-craper)中创建一个新文件夹,并创建一个新的文件名pandas_table_scraper.py。

打开一个新的终端,导航到您刚创建的文件夹(CDPANDA-HTML-TABL-SCRAPER),然后从那里安装Pandas:

复制

pip install pandas1.

将其导入文件的顶部。

复制

import pandas as pd1.

PANDAS具有称为READ_HTML()的函数,该功能主要抓住目标URL并返回所有HTML表作为DataFrame对象列表。

为了实现这一目标,至少需要对HTML表进行构建,因为该函数将寻找这样的元素来识别文件中的表。

为了使用此功能,您需要创建一个新变量并传递您在此之前使用的URL:

复制

employee_datapd.read_html('http://api.scraperapi.com?api_key=51e43be283e4db2a5afbxxxxxxxxxxxx&url=https://datatables.net/examples/styling/stripe.html')1.

输出时,它返回页面中的HTML表列表。

复制

HTMLTables1.

如果您比较数据框中的前三行,则它们与美丽的套件完全匹配。

为了处理JSON,PANDA可以具有内置的.to_json()函数。它将将数据框对象列表转换为JSON字符串。

您需要做的就是调用数据框上的方法,以路径,格式(拆分,数据,记录,索引等)进行调用,并添加凹痕以使其更可读:

复制

employee_data[0].to_json('./employee_list.json', orient='index', indent=2)1.

如果您立即运行代码,则结果文件如下:

复制

Resulting File1.

请注意,您需要从索引([0])中选择一个表,因为.read_html()返回列表,而不是一个对象。

以下是参考的完整代码:

复制

import pandas as pd   employee_data = pd.read_html('http://api.scraperapi.com?api_key=51e43be283e4db2a5afbxxxxxxxxxxxx&url=https://datatables.net/examples/styling/stripe.html')   employee_data[0].to_json('./employee_list.json', orient='index', indent=2)1.2.3.

有了这些新知识,您可以开始在网络上爬行几乎所有的HTML表。请记住,如果您了解网站的结构及其背后的逻辑,那么没有什么不能爬的。

也就是说,只要数据位于HTML文件中,这些方法就起作用。如果遇到动态生成的表,则需要找到一种新方法。

你可能想看:
« 上一篇
下一篇 »

相关推荐

python爬虫教程PDF,Python爬虫书PDF

2026年09月02日

31阅读

外国教程python,python编程教学视频

2026年09月02日

25阅读

python简明教程沈洁元,python详细基础教程

2026年09月02日

21阅读

python库包教程,python 包

2026年09月02日

27阅读

python教程大全集,python教程600集

2026年09月02日

26阅读

python入门教程完整版,python零基础入门全套教程视频

2026年09月02日

22阅读