当前位置: 首页 > 科技观察

如何使用Python遍历HTML表和抓取表格数据_0

时间:2023-03-16 15:59:37 科技观察

HowtoTraverseHTMLTablesandGrabTabularDataUsingPython它们可以存储大量有用的信息而不丢失易于阅读的格式,使它们成为数据相关项目的金矿。借助Requests和BeautifulSoup,无论您是抓取足球比赛数据还是提取股票市场数据,您都可以使用Python快速访问、解析和提取HTML表格中的数据。理解HTML表格的结构从视觉上看,HTML表格是一组以表格格式显示信息的行和列。本文重点介绍如何抓取表格数据:为了能够抓取该表中包含的数据,需要更深入地研究其编码。一般来说,HTML表格实际上是使用以下HTML标签构建的:数据所在的位置:表示表格中的一行:定义表格中的一个单元格然而,正如在现实世界中可以看到的那样,并非所有开发人员在构建表格时都遵循这些约定,这使得一些Items比其他人更难。不过,了解它们的工作原理对于找到正确的方法至关重要。在您的浏览器中输入表格的URL,然后检查页面以查看幕后情况。这就是为什么这个页面非常适合练习使用Python抓取表格数据。有一个明确的

标签对用于打开和关闭表格,所有相关数据都在标签中。它只显示10行与前端选择的条目数相匹配。关于此表还有一些事情需要了解,总共有57个条目可供获取,似乎有两种访问数据的解决方案。第一种是单击下拉菜单并选择“100”以显示所有条目:或单击“下一步”按钮浏览分页。那么哪种解决方案会更好?这两种解决方案都增加了脚本的复杂性,因此请先检查从何处提取数据。当然,因为这是一个HTML表格,所以所有数据都应该在HTML文件本身,没有AJAX注入。要验证这一点,请右键单击>查看页面源代码。接下来,复制一些单元格并在源代码中搜索它们。对来自不同分页单元格的多个条目执行相同的操作,虽然前端没有显示,但似乎所有目标数据都在那里。有了这些信息,就该开始编写代码了。使用Python的BeautifulSoup删除HTML表由于要获取的所有员工数据都在一个HTML文件中,您可以使用Requests库发送HTTP请求并使用BeautifulSoup解析响应。注意:对于网络抓取的新手,本文作者在Python教程中为初学者创建了网络抓取教程。虽然新手可以在没有经验的情况下学习,但从基础开始总是一个好主意。1.发送主请求在本项目新建目录python-html-table,然后新建文件夹bs4-table-scraper,最后新建python_table_scraper.py文件。从终端pip3安装请求beautifulsoup4并将它们导入到您的项目中,如下所示:在响应变量和输出response.status_code中。注意:如果您是Python的新手,可以使用命令python3python_table_scraper.py从终端运行代码。url='https://datatables.net/examples/styling/stripe.html'response=requests.get(url)print(response.status_code)如果有效,将返回200状态码。任何其他情况都意味着该IP被网站设置的反抓取系统拒绝。一个潜在的解决方案是向脚本添加自定义标题,使其看起来更人性化,但这可能还不够。另一种解决方案是使用网络抓取API来处理所有这些复杂性。2.使用BeautifulSoup构建解析器在提取数据之前,需要将原始HTML转换为格式化或解析后的数据。将解析后的H??TML存储到这样的soup对象中:soup=BeautifulSoup(response.text,'html.parser')从这里,可以使用HTML标记及其属性遍历解析树。如果返回到页面上的表格,您会看到该表格被包装在
标签之间,带有类stripedataTable,您可以使用它来选择表格。table=soup.find('table',class_='stripe')print(table)注:经测试,添加第二个类(dataTable)没有返回元素。实际上,在返回元素中,表的类只是stripe。您也可以使用id='example'。下面是它返回的内容:表返回现在您已经有了表,您可以遍历行并获取您需要的数据。3.遍历HTML表格回顾HTML表格的结构,每一行由一个元素表示,其中有包含数据的标签之间。为了提取数据,将创建两个forlooks,一个用于获取表的部分(所有行所在的位置),另一个用于将所有行存储到一个可以使用的变量中:foremployee_datain桌子。find_all('tbody'):rows=employee_data.find_all('tr')print(rows)inrows,将存储在表格文本部分中找到的所有元素。如果你遵循这个逻辑,下一步就是将每一行存储到一个对象中,并循环遍历它们以找到你需要的数据。首先,尝试使用.querySelectorAll()方法在浏览器控制台上选择第一个员工的姓名。该方法的一个真正有用的特性是大于号(>)的层次结构可以实现得越来越深,以定义要获取的父元素(左侧)和子元素(右侧)。document.querySelectorAll('table.stripe>tbody>tr>td')[0]如上所见,一旦所有
元素,所有元素都包裹在成对的
元素,这些元素就变成了list的节点。因为你不能依赖类来获取每个单元格,你只需要知道它们在索引中的位置,并且第一个名字是0。从那里,代码可以这样写:forrowinrows:name=row.find_all('td')[0].textprint(name)简单地说,逐行获取每一行,并找到所有单元格它,一旦你有了列表,只需获取索引中的第一个单元格(位置0),然后使用.text方法只获取元素的文本,忽略你不需要的HTML数据。这是一个包含所有员工姓名的列表!对于其余部分,只需遵循相同的逻辑:position=row.find_all('td')[1].textoffice=row.find_all('td')[2]。textage=row.find_all('td')[3].textstart_date=row.find_all('td')[4].textsalary=row.find_all('td')[5].text但是,所有的控制台上的数据输出不是很有帮助。相反,这些数据可以以一种新的、更有用的格式存储。4.将表格数据存储到JSON文件中虽然创建CSV文件并将数据发送到那里很容易,但如果您可以使用抓取的数据创建一些新内容,那么它并不是最容易管理的格式。尽管如此,之前的一个项目解释了如何创建CSV文件来存储抓取的数据。好消息是Python有自己的JSON模块来处理JSON对象,所以你不需要安装任何东西,只需导入它。然而,importjson需要在继续创建JSON文件之前将所有这些抓取的数据转换为列表。为此,在循环外创建了一个空数组。employee_list=[]然后向其追加数据,每次循环向数组追加一个新对象。employee_list.append({'Name':name,'Position':position,'Office':office,'Age':age,'Startdate':start_date,'salary':salary})ifprint(employee_list),其结果如下:Employee_List仍然有点乱,但已经有一组准备好转换为JSON的对象。注意:作为测试,输出employee_list的长度并返回57,这是要抓取的正确行数(行现在是数组中的对象)。将列表导入JSON只需要两行代码:withopen('json_data','w')asjson_file:json.dump(employee_list,json_file,indent=2)首先,打开一个新文件,传入想要的文件name(json_data)和'w',因为要写入数据。接下来,使用.dump()函数从缩进=2的数组(employee_list)中转储数据,以便每个对象都有自己的行,而不是一行中的所有内容。5.运行脚本和完整代码如果你一直按照下面的方法,代码库应该是这样的:#dependenciesimportrequestsfrombs4importBeautifulSoupimportjsonurl='http://api.scraperapi.com?api_key=51e43be283e4db2a5afbxxxxxxxxxxx&url=https://datatables.net/examples/styling/stripe.html'#空数组employee_list=[]#请求并解析HTML文件response=requests.get(url)soup=BeautifulSoup(response.text,'html.parser')#selectingthetabletable=soup.find('table',class_='stripe')#将所有行存储到一个变量中employee_dataintable.find_all('tbody'):rows=employee_data.find_all('tr')#循环遍历HTML表以逐行抓取数据:name=row.find_all('td')[0].textposition=row.find_all('td')[1].textoffice=行。find_all('td')[2].textage=row.find_all('td')[3].textstart_date=row.find_all('td')[4].textsalary=row.find_all('td')[5].text#将抓取的数据发送到空数组employee_list.append({'Name':name,'Position':position,'Office':office,'Age':age,'Startdate':start_date,'salary':salary})#将数组导入JSONfilewithopen('employee_data','w')asjson_file:json.dump(employee_list,json_file,indent=2)注意:在此处为场景添加了一些注释以下是JSON文件中的前三个对象:Storingscrapeeddata以一种允许在新应用程序中使用信息的格式使用Pandas抓取HTML表格在离开页面之前,您想探索第二种抓取HTML表格的方法。只需几行代码,您就可以从HTML文档中获取所有表格数据,并使用Pandas将其存储到数据框中。在项目目录下新建文件夹(命名为pandas-html-table-scraper),新建文件名pandas_table_scraper.py。打开一个新终端,导航到您刚刚创建的文件夹(cdpanda-html-table-scraper),然后从那里安装pandas:pipinstallpandasimportitatthetopofthefile。importpandasaspdPandas有一个名为read_html()的函数,它基本上获取目标URL并将所有HTML表作为DataFrame对象列表返回。为此,HTML表格至少需要结构化,因为该函数将查找诸如之类的元素来标识文件中的表格。要使用此函数,请创建一个新变量并将您之前使用的URL传递给它:.html')输出时,它会返回页面内的HTML表格列表。HTMLTables如果比较DataFrame中的前三行,它们与使用BeautifulSoup获取的结果完全匹配。为了处理JSON,Pandas可以有一个内置的.to_json()函数。它会将DataFrame对象列表转换为JSON字符串。而你需要做的就是调用DataFrame上的方法,传入路径、格式(拆分、数据、记录、索引等),并添加缩进以使其更具可读性:employee_data[0].to_json('./employee_list.json',orient='index',indent=2)如果现在运行代码,得到的文件如下:ResultingFile注意需要从index([0])中选择表,因为.read_html()返回一个列表,而不是单个对象。这是参考的完整代码importpandasaspdemployee_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)有了这些新知识,是时候开始抓取网络上几乎所有的HTML表格了。请记住,如果您了解网站的结构及其背后的逻辑,就没有什么是无法抓取的。也就是说,只要数据在HTML文件中,这些方法就可以工作。如果遇到动态生成的表,就需要另辟蹊径了。原标题:HowtoUsePythontoLoopThroughHTMLTablesandScrapeTabularData,作者:ZoltanBettenbuk