HowtoTraverseHTMLTablesandGrabTabularDataUsingPython它们可以存储大量有用的信息而不丢失易于阅读的格式,使它们成为数据相关项目的金矿。借助Requests和BeautifulSoup,无论您是抓取足球比赛数据还是提取股票市场数据,您都可以使用Python快速访问、解析和提取HTML表格中的数据。理解HTML表格的结构从视觉上看,HTML表格是一组以表格格式显示信息的行和列。本文重点介绍如何抓取表格数据:为了能够抓取该表中包含的数据,需要更深入地研究其编码。一般来说,HTML表格实际上是使用以下HTML标签构建的:数据所在的位置
元素,所有元素都包裹在成对的 |
元素,这些元素就变成了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表格至少需要结构化,因为该函数将查找诸如 |