首先,尝试使用.querySelectorAll()方法在浏览器控制台上选择第一个员工的名字。这个方法的一个真正有用的特性是,可以越来越深入地实现大于(>)符号的层次结构,以定义父元素(在左侧)和要获取的子元素(在右侧)。
元素,这些元素就会成为节点列表。因为不能依赖类来获取每个单元格,所以只需要知道它们在索引中的位置,而第一个name是0。 从那里,可以像这样编写代码: for row in rows: name = row.find_all('td')[0].text print(name) 简单地说,逐个获取每一行,并找到其中的所有单元格,一旦有了列表,只获取索引中的第一个单元格(position 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].text 然而,将所有这些数据输出在控制台上并没有太大帮助。与其相反,可以将这些数据存储为一种、更有用的新格式。 4.将表格数据存储到JSON文件中 虽然可以轻松地创建一个CSV文件并将数据发送到那里,但如果可以使用抓取的数据创建一些新内容,那么这将不是最容易管理的格式。 尽管如此,以前做的一个项目解释了如何创建一个CSV文件来存储抓取的数据。 好消息是,Python有自己的JSON模块来处理JSON对象,所以不需要安装任何程序,只需要导入它。 import json 但是,在继续并创建JSON文件之前,需要将所有这些抓取的数据转换为一个列表。为此,将在循环外部创建一个空数组。 employee_list = [] 然后向它追加数据,每个循环向数组追加一个新对象。 employee_list.append({ 'Name': name, 'Position': position, 'Office': office, 'Age': age, 'Start date': start_date, 'salary': salary }) 如果print(employee_list),其结果如下: Employee_List 还是有点混乱,但已经有了一组准备转换为JSON的对象。 注:作为测试,输出employee_list的长度,它返回57,这是抓取的正确行数(行现在是数组中的对象)。 将列表导入到JSON只需要两行代码: with open('json_data', 'w') as json_file: json.dump(employee_list, json_file, indent=2)
- 首先,打开一个新文件,传入想要的文件名称(json_data)和'w',因为想要写入数据。
- 接下来,使用.dump()函数从数组(employee_list)和indent=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) 注:在这里为场景添加了一些注释。 以下是JSON文件中的前三个对象: 以JSON格式存储抓取数据允将信息用于新的应用程序 使用Pandas抓取HTML表 在离开页面之前,希望探索第二种抓取HTML表的方法。只需几行代码,就可以从HTML文档中抓取所有表格数据,并使用Pandas将其存储到数据框架中。 在项目的目录中创建一个新文件夹(将其命名为panda-html-table-scraper),并创建一个新文件名pandas_table_scraper.py。 打开一个新的终端,导航到刚刚创建的文件夹(cdpanda-html-table-scraper),并从那里安装pandas: pip install pandas 在文件的顶部导入它。 import pandas as pd 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') 当输出它时,它将返回页面内的HTML表列表。 HTMLTables 如果比较DataFrame中的前三行,它们与采用BeautifulSoup抓取的结果完全匹配。 为了处理JSON,Pandas可以有一个内置的.to_json()函数。它将把DataFrame对象列表转换为JSON字符串。 而所需要做的就是调用DataFrame上的方法,并传入路径、格式(split,data,records,index等),并添加缩进以使其更具可读性: employee_data[0].to_json('./employee_list.json', orient='index', indent=2) 如果现在运行代码,其结果文件如下: Resulting File 注意,需要从索引([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) 有了这些新知识,就可以开始抓取网络上几乎所有的HTML表了。只要记住,如果理解了网站的结构和背后的逻辑,就没有什么是不能抓取的。 也就是说,只要数据在HTML文件中,这些方法就有效。如果遇到动态生成的表,则需要找到一种新的方法。 原文标题:How to Use Python to Loop Through HTML Tables and Scrape Tabular Data,作者:Zoltan Bettenbuk
本文名称:如何使用Python遍历HTML表和抓取表格数据
文章源于:http://www.mswzjz.cn/qtweb/news46/507196.html
攀枝花网站建设、攀枝花网站运维推广公司-贝锐智能,是专注品牌与效果的网络营销公司;服务项目有等
广告
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源:
贝锐智能
|