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网页数据抓取教程:使用requests和BeautifulSoup快速上手
Python爬虫教程:解析requests.get()响应对象与BeautifulSoup提取HTML内容
Python网页信息获取与解析:使用requests库爬取HTML数据的大数据时代应用
如何使用Python抓取网页文字:从HTML基础到requests库的全面指南
版本控制 12.什么是RESTfulAPI RESTfulAPI的幂等性以及RESTfulAPI的经常出现留意事项 (版本控制系统会存储每个版本的全量副本)
Python教程:使用Requests和Wget模块从Web下载文件的完整指南