1. 提取表格数据
表格和洋葱有什么共同点?没错,层次!
HTML中的表格就像是分层的蛋糕,由 <table>
、 <tr>
(行)、 <th>
(标题单元格)和 <td>
(普通单元格)组成。每个元素在数据表示中均有自己的作用,我们需要逐层深入来提取信息。
实践!实践!再实践!
来看看以下这个简单的HTML表格:
<table>
<tr>
<th>名字</th>
<th>年龄</th>
<th>城市</th>
</tr>
<tr>
<td>Alice</td>
<td>29</td>
<td>莫斯科</td>
</tr>
<tr>
<td>Bob</td>
<td>34</td>
<td>圣彼得堡</td>
</tr>
</table>
步骤 1: 在页面中找到表格
网页中的表格由HTML标签<table>
定义,表格内的数据存放在<tr>
(表格行)和<td>
(数据单元格)标签中。在 BeautifulSoup
中,方法find
可帮助找到页面中的第一个表格,而 find_all
可以找到所有表格。
# 在页面中搜索第一个表格
table = soup.find("table")
如果需要提取特定表格,可以通过指定表格的属性如id
或class
来细化搜索。
# 根据类名搜索表格
table = soup.find("table", {"class": "table-class"})
步骤 2: 提取表格中的数据
加载表格后即可开始提取数据。由于表格中的数据是按行排列的,因此逻辑上需要遍历表格的每一行,并从每个单元格中提取数据。
提取标题
表格的标题通常放在第一行,并用<th>
标签包裹。通过使用find_all
方法,可将所有标题收集到一个列表中。
# 从表格的第一行提取标题
headers = []
header_row = table.find("tr")
for th in header_row.find_all("th"):
headers.append(th.text.strip())
print("表格标题:", headers)
提取数据行
为提取所有数据行(通常用<tr>
标签包裹,每个单元格用<td>
标签包裹),我们使用嵌套循环:首先找到所有行<tr>
,然后遍历每行中的单元格<td>
。
# 提取所有数据行
data = []
rows = table.find_all("tr")[1:] # 跳过标题行
for row in rows:
row_data = []
for cell in row.find_all("td"):
row_data.append(cell.text.strip())
data.append(row_data)
print("表格数据:", data)
这段代码会仔细遍历表格行,并从每个单元格中提取文本。是不是很神奇?当然,这种神奇离不开循环的魔力!
2. 操作列表
列表:表格的兄长
在生活中,有两种无穷无尽的东西:表格和列表。列表用 <ul>
(无序列表)和 <ol>
(有序列表)表示,而它们的元素是 <li>
。与表格相比,列表简单又极简,这使得它们成为快速高效处理数据的理想选择!
从列表中提取数据
看看这个HTML列表的例子:
<ul>
<li>苹果</li>
<li>香蕉</li>
<li>葡萄</li>
</ul>
现在让我们使用老朋友BeautifulSoup
来提取这些数据:
html = """
<ul>
<li>苹果</li>
<li>香蕉</li>
<li>葡萄</li>
</ul>
"""
soup = BeautifulSoup(html, 'html.parser')
ul = soup.find('ul')
items = ul.find_all('li')
for item in items:
print(item.get_text())
就这样!简单又高效的方法,您可以将其应用到更复杂的结构中。
3. 表格数据提取与处理示例
为了加强理解,我们从一个类似但更复杂的例子中提取数据进行练习:
<table id="courses">
<tr>
<th>课程</th>
<th>讲师</th>
</tr>
<tr>
<td>为所有人学Python</td>
<td>Guido van Rossum</td>
</tr>
<tr>
<td>Python自动化</td>
<td>Eric Matthes</td>
</tr>
</table>
<ul class="technologies">
<li>Python</li>
<li>JavaScript</li>
<li>HTML & CSS</li>
</ul>
为提取表格和列表中的数据,可以设置以下请求:
html = """
<table id="courses">
<tr>
<th>课程</th>
<th>讲师</th>
</tr>
<tr>
<td>为所有人学Python</td>
<td>Guido van Rossum</td>
</tr>
<tr>
<td>Python自动化</td>
<td>Eric Matthes</td>
</tr>
</table>
<ul class="technologies">
<li>Python</li>
<li>JavaScript</li>
<li>HTML & CSS</li>
</ul>
"""
soup = BeautifulSoup(html, 'html.parser')
# 提取表格数据
course_table = soup.find('table', id='courses')
course_rows = course_table.find_all('tr')
for row in course_rows:
cells = row.find_all(['th', 'td'])
for cell in cells:
print(cell.get_text())
print("---")
# 提取列表数据
tech_list = soup.find('ul', class_='technologies')
tech_items = tech_list.find_all('li')
for item in tech_items:
print(item.get_text())
这个脚本包含数据的两种类型。请注意,我们是如何使用id和class来准确定位元素的。在实际应用中,您可能会遇到更复杂的HTML结构,但处理方式都是一样的:从最高层开始,逐步分解元素,最终提取出宝贵的数据!
4. 部分总结及常见错误
在网页上操作表格和列表,就像是迷宫中的导航。有时我们会遇到不完美的数据,比如空单元格或缺失的元素。在这些情况下,确保数据的正确性和完整性非常重要。常见错误比如尝试访问不存在的元素或错误地使用选择器。请记住,HTML可能并不像我们希望的那样干净有序,因此始终要考虑异常处理和数据验证。
这些知识有什么用?
本课中学到的知识可以帮助您自动提取和处理来自多个在线资源的数据。例如,您可以自动收集股票交易表格中的数据,设置对电商网站价格的监控,甚至定期分析博客和新闻网站中的数据。掌握从表格和列表中提取数据的技术,为您开启了自动化和数据分析的大门。
GO TO FULL VERSION