Beautiful Soup(从简单HTML中抓取数据)
在本节课中,我们将讨论如何使用 Beautiful Soup 从公共网页中提取数据。
Beautiful Soup
你是否好奇过人们是如何从公开网页中提取数据并进行分析的?他们使用一些库和工具来简化从公共网络(更专业地说,称为“数据抓取”)中提取数据的过程。Beautiful Soup 正是为此类用途设计的一个库。数据科学领域长期使用它来抓取公开网页的数据,因为它能够从 HTML 和 XML 文件中提取信息,并且拥有详尽的文档,易于上手。
网页由 HTML(超文本标记语言)构成。Beautiful Soup 可以通过指定 HTML 中的具体元素,直接从中提取数据。以下是 HTML 标记结构的示例及其常见标签的简要说明:
1<!DOCTYPE html> 2<html> 3 <head> 4 <title>Data Science Course</title> 5 <style></style> 6 </head> 7 <body> 8 <h1 class="my-heading"> 这是一个标题标签 </h1> 9 <p id="my-paragraph"> 这是数据科学课程中的一个段落 </p> 10 <em> 这是数据科学课程中的强调标签 </em> 11 <b> 这是加粗文本标签 </b> 12 <i> 这是斜体文本标签 </i> 13 <small> 这是小号字体标签 </small> 14 <u> 这是下划线文本标签 </u> 15 <a href="https://www.educative.io/"> 这是到 Educative 首页的链接 </a> 16 <a href="https://www.facebook.com/"> 这是到 Facebook 首页的链接 </a> 17 <a href="https://twitter.com/"> 这是到 Twitter 首页的链接 </a> 18 19 <script></script> 20 </body> 21</html>
从上面的代码片段可以看出,HTML 中的不同标签是如何组织的。我们可以利用这些标签提取所需的信息。Beautiful Soup 会按照代码中的指定方式遍历上述标签,从而提取出相关元素。
练习
任务
在本练习中,我们将学习如何使用 Beautiful Soup,从上面的 HTML 示例中抓取数据,并提取其中基本 HTML 标签所包含的信息。
解答
1# 导入所需库 2from bs4 import BeautifulSoup 3 4# 从 HTML 页面创建 Soup 对象 5html_page = """ 6<!DOCTYPE html> 7<html> 8 <head> 9 <title>Data Science Course</title> 10 <style></style> 11 </head> 12 <body> 13 <h1 class="my-heading"> 这是一个标题标签 </h1> 14 <p id="my-paragraph"> 这是数据科学课程中的一个段落 </p> 15 <em> 这是数据科学课程中的强调标签 </em> 16 <b> 这是加粗文本标签 </b> 17 <i> 这是斜体文本标签 </i> 18 <small> 这是小号字体标签 </small> 19 <u> 这是下划线文本标签 </u> 20 <a href="https://www.educative.io/"> 这是到 Educative 首页的链接 </a> 21 <a href="https://www.facebook.com/"> 这是到 Facebook 首页的链接 </a> 22 <a href="https://twitter.com/"> 这是到 Twitter 首页的链接 </a> 23 24 <script></script> 25 </body> 26</html> 27""" 28 29soup = BeautifulSoup(html_page) 30 31# 获取 HTML 中的 <title> 标签 32print("对应 HTML 中的 <title> 标签为 \n") 33print(soup.title) 34print("\n") 35 36 37# 获取 HTML 中的 <head> 标签 38print("对应 HTML 中的 <head> 标签为 \n") 39print(soup.head) 40print("\n") 41 42 43# 获取 <title> 标签的名称 44print("<title> 标签的名称为 \n") 45print(soup.title.name) 46print("\n") 47 48 49# 获取 <head> 标签的名称 50print("<head> 标签的名称为 \n") 51print(soup.head.name) 52print("\n") 53 54 55# 获取 <title> 标签内的文本 56print("<title> 标签内的文本为 \n") 57print(soup.title.string) 58print("\n") 59 60 61# 获取 <head> 标签内的文本 62print("<head> 标签内的文本为 \n") 63print(soup.head.string) 64print("\n") 65 66 67# 显示 HTML 中所有锚点标签 68print("HTML 中存在的锚点标签有:") 69print(soup.find_all('a')) 70print("\n") 71 72 73# 显示锚点标签中使用的链接 74for link in soup.find_all('a'): 75 print("链接 URL: {}".format(link.get('href'))) 76 print("锚点文本: {}".format(link.text)) 77 print("\n")
-
第 5 行:我们定义了待提取数据的 HTML 字符串。
-
第 29 行:创建了一个
BeautifulSoup对象。 -
第 33 行:输出 HTML 页面中
<title>标签的内容。 -
第 39 行:输出 HTML 页面中
<head>标签的内容。 -
第 45 行和第 51 行:分别输出
<title>和<head>标签的名称。 -
第 57 行和第 63 行:输出
<title>和<head>标签内部的文本内容。 -
第 69 行:输出整个 HTML 页面中的所有锚点
<a>标签。 -
第 75 到 77 行:依次输出锚点
<a>标签中的链接地址及其对应的锚点文本。