📌  相关文章
📜  如何使用 beautifulsoup 从网站中提取数据 - Python (1)

📅  最后修改于: 2023-12-03 14:51:50.653000             🧑  作者: Mango

如何使用 BeautifulSoup 从网站中提取数据 - Python

当我们需要从网站中提取数据时,可以使用 Python 中一个强大的库 BeautifulSoup。 它可以用来解析 HTML 和 XML 等文件,并提供了很多有用的工具函数来提取需要的数据,让我们更加方便地处理数据。

安装 BeautifulSoup

在开始使用 BeautifulSoup 之前,需要先安装它。可以使用 pip 进行安装,通过在终端中输入以下命令进行安装:

pip install beautifulsoup4
解析 HTML

下面是一个简单的 HTML 文件示例,我们将使用 BeautifulSoup 来解析该文件:

<!DOCTYPE html>
<html>
<head>
	<title>Test Page</title>
</head>
<body>
	<div class="container">
		<h1>Hello, World!</h1>
		<p>这是一个测试页面。</p>
		<ul>
			<li>列表项 1</li>
			<li>列表项 2</li>
			<li>列表项 3</li>
		</ul>
	</div>
</body>
</html>

下面的 Python 代码演示了如何使用 BeautifulSoup 解析 HTML 文件:

from bs4 import BeautifulSoup

# 读取 HTML 文件
with open('test.html', 'r') as f:
    html = f.read()

# 解析 HTML 文件
soup = BeautifulSoup(html, 'html.parser')

# 打印解析结果
print(soup.prettify())

运行上述代码会输出以下内容:

<!DOCTYPE html>
<html>
 <head>
  <title>
   Test Page
  </title>
 </head>
 <body>
  <div class="container">
   <h1>
    Hello, World!
   </h1>
   <p>
    这是一个测试页面。
   </p>
   <ul>
    <li>
     列表项 1
    </li>
    <li>
     列表项 2
    </li>
    <li>
     列表项 3
    </li>
   </ul>
  </div>
 </body>
</html>
提取数据

在解析 HTML 文件后,我们可以通过 BeautifulSoup 提供的各种工具函数来提取需要的数据。下面是一些常用的提取数据的方法:

1. 获取标签

我们可以使用 soup.标签名 的方式获取 HTML 文件中的标签。

例如,要获取 title 标签的内容,可以使用以下代码:

title = soup.title
print(title)

运行该代码会输出以下内容:

<title>Test Page</title>

如果要获取标签的属性,可以使用 标签名['属性名'] 的方式。

例如,要获取 div 标签的 class 属性,可以使用以下代码:

div = soup.div
print(div['class'])

运行该代码会输出以下内容:

['container']
2. 获取标签内容

我们可以使用 标签名.text 的方式获取标签的文本内容,例如:

h1 = soup.h1
print(h1.text)

运行该代码会输出以下内容:

Hello, World!
3. 获取标签属性

我们可以使用 标签名['属性名'] 的方式获取标签的属性值,例如:

div = soup.div
print(div['class'])

运行该代码会输出以下内容:

['container']
4. 获取标签中的所有子节点

我们可以使用 标签名.contents 的方式获取标签中的所有子节点,例如:

ul = soup.ul
print(ul.contents)

运行该代码会输出以下内容:

[<li>列表项 1</li>, <li>列表项 2</li>, <li>列表项 3</li>]
5. 获取标签中的所有子孙节点

我们可以使用 标签名.descendants 的方式获取标签中的所有子孙节点,例如:

div = soup.div
for child in div.descendants:
    print(child)

运行该代码会输出以下内容:

<h1>Hello, World!</h1>
<p>这是一个测试页面。</p>
<ul>
<li>列表项 1</li>
<li>列表项 2</li>
<li>列表项 3</li>
</ul>
<li>列表项 1</li>
列表项 1
<li>列表项 2</li>
列表项 2
<li>列表项 3</li>
列表项 3
6. 获取符合条件的标签

我们可以使用 soup.find_all()soup.select() 的方式获取符合条件的标签。

例如,要获取所有 li 标签的内容,可以使用以下代码:

lis = soup.find_all('li')
for li in lis:
    print(li.text)

运行该代码会输出以下内容:

列表项 1
列表项 2
列表项 3

find_all() 方法的语法为:find_all(name=None, attrs={}, recursive=True, text=None, limit=None, **kwargs)

其中,name 参数指定要查找的标签名,attrs 参数指定要查找的属性,recursive 参数指定是否要递归查找,默认为 True,text 参数指定要查找的文本内容,limit 参数指定最多返回的结果数量。

例如,要获取 class 属性为 containerdiv 标签,可以使用以下代码:

div = soup.find_all('div', {'class': 'container'})
print(div)

运行该代码会输出以下内容:

[<div class="container">
<h1>Hello, World!</h1>
<p>这是一个测试页面。</p>
<ul>
<li>列表项 1</li>
<li>列表项 2</li>
<li>列表项 3</li>
</ul>
</div>]

select() 方法使用 CSS 选择器的方式查找符合条件的标签,语法为:select(css_selectors)

例如,要获取 class 属性为 containerdiv 标签,可以使用以下代码:

div = soup.select('div.container')
print(div)

运行该代码会输出以下内容:

[<div class="container">
<h1>Hello, World!</h1>
<p>这是一个测试页面。</p>
<ul>
<li>列表项 1</li>
<li>列表项 2</li>
<li>列表项 3</li>
</ul>
</div>]
总结

本文介绍了如何使用 BeautifulSoup 从网站中提取数据。我们首先学习了如何解析 HTML 文件,然后介绍了如何提取数据和查找标签等操作,通过学习本文,可以更加方便地处理数据。