python的BeautifulSoup库怎么用(详细教程)

BeautifulSoup 是 Python 中一个常用的解析 HTML 和 XML 的第三方库,使用它可以方便地从网页中提取数据。以下是一个简单的例子:

假设我们要从一个示例 HTML 文件中提取 h1 标签中的文本内容,可以按照如下步骤使用 BeautifulSoup 库:

# 导入库
from bs4 import BeautifulSoup

# 读取示例 HTML 文件
html = """
<html>
    <head>
        <title>Example Page</title>
    </head>
    <body>
        <h1>Hello, World!</h1>
    </body>
</html>
"""

# 创建 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_allselect 等,可以根据不同的需求进行选择和使用。此外,BeautifulSoup 还提供了一些常见的属性和方法,例如 namestringattrs 等,可用于获取标签的名称、文本、属性等信息。

安装

BeautifulSoup 是第三方库,可以通过 pip 命令进行安装:

pip install beautifulsoup4

基本用法

在使用 BeautifulSoup 之前,我们需要先加载一个 HTML 或 XML 文档,并将其解析成 BeautifulSoup 对象。可以使用以下两种方式进行解析:

方式一:从字符串中解析

from bs4 import BeautifulSoup

# 从字符串中解析 HTML 或 XML
html_doc = '<html><head><title>Example Page</title></head><body><p>This is a paragraph.</p></body></html>'
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

<!DOCTYPE html>
<html>
<head>
	<title>Example Page</title>
</head>
<body>
	<h1>Hello, World!</h1>
	<p class="first">This is the <b>first</b> paragraph.</p>
	<p class="second">This is the <b>second</b> paragraph.</p>
	<a href="https://www.example.com">Go to Example Website</a>
</body>
</html>

我们可以使用 BeautifulSoup 对象 soup 来提取其中的数据。例如,要获取文档标题,可以使用 title 属性

print(soup.title)
# <title>Example Page</title>

要获取标签的文本内容,可以使用 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 除了基本的用法之外,还有一些高级应用,例如:

  • 使用 CSS 选择器来查找标签;
  • 解析 XML 文档;
  • 处理特定类型的标签,例如 script 和 style 标签;
  • 自定义解析器等。

这里介绍其中的几个应用:

使用 CSS 选择器

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.

解析 XML 文档

与解析 HTML 文档类似,BeautifulSoup 也支持解析 XML 文档。只需要将解析器切换为 ‘xml’ 即可。例如:

from bs4 import BeautifulSoup

xml_doc = """
<root>
  <item>
    <name>Item 1</name>
    <price>10.00</price>
  </item>
  <item>
    <name>Item 2</name>
    <price>20.00</price>
  </item>
</root>
"""

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 = """
<html>
<head>
	<style>
		p { color: red; }
	</style>
</head>
<body>
	<h1>Hello, World!</h1>
	<p>This is a paragraph.</p>
	<script>
		alert('Hello, World!');
	</script>
</body>
</html>
"""

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 网络爬虫开发中常用的工具之一。

文章出处登录后可见!

已经登录?立即刷新

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
社会演员多的头像社会演员多普通用户
上一篇 2023年11月29日
下一篇 2023年11月29日

相关推荐