BeautifulSoup 是 Python 中一个常用的解析 HTML 和 XML 的第三方库,使用它可以方便地从网页中提取数据。以下是一个简单的例子:
假设我们要从一个示例 HTML 文件中提取 h1 标签中的文本内容,可以按照如下步骤使用 BeautifulSoup 库:
# 导入库
from bs4 import BeautifulSoup
# 读取示例 HTML 文件
html = """
Example Page
Hello, World!
"""
# 创建 BeautifulSoup 对象,并指定解析器为 lxml
soup = BeautifulSoup(html, 'lxml')
# 找到第一个 h1 标签,并输出其文本内容
h1 = soup.find('h1')
print(h1.text)
在上述代码中,我们首先读取了一个示例 HTML 文件,然后创建了一个 BeautifulSoup 对象,指定了使用 lxml 解析器来解析 HTML。接着,我们使用 find
方法找到了第一个 h1 标签,并通过 text
属性获取了其中的文本内容。最终运行结果会输出 "Hello, World!"。
除了 find
方法,还有其他一些常用的方法,例如 find_all
、select
等,可以根据不同的需求进行选择和使用。此外,BeautifulSoup 还提供了一些常见的属性和方法,例如 name
、string
、attrs
等,可用于获取标签的名称、文本、属性等信息。
BeautifulSoup 是第三方库,可以通过 pip 命令进行安装:
pip install beautifulsoup4
在使用 BeautifulSoup 之前,我们需要先加载一个 HTML 或 XML 文档,并将其解析成 BeautifulSoup 对象。可以使用以下两种方式进行解析:
from bs4 import BeautifulSoup
# 从字符串中解析 HTML 或 XML
html_doc = 'Example Page This is a paragraph.
'
soup = BeautifulSoup(html_doc, 'html.parser')
在上述代码中,我们首先创建了一个字符串 html_doc
,然后使用 BeautifulSoup
类将其解析成一个 BeautifulSoup 对象 soup
。第二个参数指定使用 html.parser 解析器来解析 HTML,如果要解析 XML,则需要使用其他解析器。
from bs4 import BeautifulSoup
# 从文件中读取 HTML 或 XML
with open('example.html', 'r') as f:
soup = BeautifulSoup(f, 'html.parser')
在上述代码中,我们使用 open
函数打开一个名为 example.html
的文件,然后使用 BeautifulSoup
类将其解析成一个 BeautifulSoup 对象 soup
。同样地,第二个参数指定使用 html.parser 解析器来解析 HTML,如果要解析 XML,则需要使用其他解析器。
假设我们有以下 HTML 文件 example.html
:
Example Page
Hello, World!
This is the first paragraph.
This is the second paragraph.
Go to Example Website
我们可以使用 BeautifulSoup 对象 soup
来提取其中的数据。例如,要获取文档标题,可以使用 title
属性
print(soup.title)
# Example Page
要获取标签的文本内容,可以使用 text
属性或 string
属性:
print(soup.h1.text)
# Hello, World!
print(soup.h1.string)
# Hello, World!
要获取标签的属性,可以使用 attrs
属性:
print(soup.a.attrs['href'])
# https://www.example.com
要获取所有符合条件的标签,可以使用 find_all
方法:
# 获取所有 p 标签
ps = soup.find_all('p')
for p in ps:
print(p.text)
# This is the first paragraph.
# This is the second paragraph.
# 获取 class 为 "second" 的 p 标签
p = soup.find('p', {'class': 'second'})
print(p.text)
# This is the second paragraph.
要获取某个标签的父标签或祖先标签,可以使用 parent
属性或 parents
属性:
p = soup.find('p', {'class': 'first'})
print(p.parent.name)
# body
for parent in p.parents:
print(parent.name)
# p
# body
# html
# [document]
BeautifulSoup 除了基本的用法之外,还有一些高级应用,例如:
这里介绍其中的几个应用:
BeautifulSoup 支持使用 CSS 选择器来查找标签,可以使用 select
方法。例如,要获取 class 为 "second" 的 p 标签,可以使用以下代码:
p = soup.select_one('p.second')
print(p.text以上回答的最后一行代码似乎缺失了一个右括号,以下是修复过的完整代码:
```python
p = soup.select_one('p.second')
print(p.text)
# This is the second paragraph.
在上述代码中,我们使用 select_one
方法和 CSS 选择器 p.second
来获取 class 为 "second" 的 p 标签,并输出其中的文本内容。
如果要获取所有符合条件的标签,可以使用 select
方法:
ps = soup.select('p')
for p in ps:
print(p.text)
# This is the first paragraph.
# This is the second paragraph.
ps = soup.select('p.first')
for p in ps:
print(p.text)
# This is the first paragraph.
与解析 HTML 文档类似,BeautifulSoup 也支持解析 XML 文档。只需要将解析器切换为 'xml' 即可。例如:
from bs4 import BeautifulSoup
xml_doc = """
-
Item 1
10.00
-
Item 2
20.00
"""
soup = BeautifulSoup(xml_doc, 'xml')
items = soup.find_all('item')
for item in items:
name = item.find('name').text
price = item.find('price').text
print(f'{name}: {price}')
在上述代码中,我们将解析器指定为 'xml',然后使用 find_all 和 find 方法查找特定的标签,并输出其中的文本内容。
有些特殊的标签,例如 script 和 style 标签,其内容并不是普通的文本,而是包含了 JavaScript 代码和 CSS 样式等信息。如果直接使用 text
属性获取其内容,会导致 JavaScript 代码和 CSS 样式丢失。为了解决这个问题,BeautifulSoup 提供了 string
属性和 get_text
方法来获取特定类型标签内的全部文本,包括其中的 JavaScript 代码和 CSS 样式。例如:
from bs4 import BeautifulSoup
html_doc = """
Hello, World!
This is a paragraph.
"""
soup = BeautifulSoup(html_doc, 'html.parser')
# 获取 style 标签中的样式代码
style = soup.find('style').string
print(style)
# p { color: red; }
# 获取 script 标签中的 JavaScript 代码
script = soup.find('script').get_text()
print(script)
# \n\t\talert('Hello, World!');\n
在上述代码中,我们分别使用 string
属性和 get_text
方法获取了 style 和 script 标签中的全部内容。
以上就是一个比较详细的 BeautifulSoup 教程,包括安装、基本用法和一些高级应用。BeautifulSoup 可以帮助我们方便地解析 HTML 和 XML 文档,并从中提取所需的信息,是 Python 网络爬虫开发中常用的工具之一。