第152集 BeautifulSoup基础
1 什么是BeautifulSoup?
BeautifulSoup是一个Python库,用于从HTML和XML文件中提取数据。它能够将复杂的HTML文档转换成一个复杂的树形结构,每个节点都是Python对象,便于我们进行数据提取和操作。
2 BeautifulSoup的安装
在使用BeautifulSoup之前,我们需要先安装它。同时,BeautifulSoup需要配合解析器一起使用,常用的解析器有lxml和html.parser。
pip install beautifulsoup4
pip install lxml3 BeautifulSoup的基本使用
3.1 导入库并创建BeautifulSoup对象
from bs4 import BeautifulSoup
# 使用lxml解析器解析HTML字符串
html_doc = """
<html><head><title>这是标题</title></head>
<body>
<p class="title"><b>这是段落标题</b></p>
<p class="content">这是第一个段落内容。</p>
<p class="content">这是第二个段落内容。</p>
<a href="http://example.com/link1" class="link">链接1</a>
<a href="http://example.com/link2" class="link">链接2</a>
</body>
</html>
"""
soup = BeautifulSoup(html_doc, 'lxml')3.2 访问文档内容
# 获取文档标题
print("文档标题:", soup.title.string)
# 获取文档中的所有段落
paragraphs = soup.find_all('p')
print("所有段落:")
for p in paragraphs:
print(p.get_text())4 BeautifulSoup的常用对象类型
4.1 Tag对象
Tag对象代表HTML中的标签,例如<title>、<p>等。
# 获取title标签
title_tag = soup.title
print("title标签:", title_tag)
print("title标签名称:", title_tag.name)
print("title标签内容:", title_tag.string)4.2 NavigableString对象
NavigableString对象代表标签中的文本内容。
# 获取title标签的文本内容
title_text = soup.title.string
print("title文本内容:", title_text)
print("文本类型:", type(title_text))4.3 BeautifulSoup对象
BeautifulSoup对象代表整个HTML文档。
print("BeautifulSoup对象类型:", type(soup))
print("文档根标签:", soup.html)5 BeautifulSoup的查找方法
5.1 find()方法
find()方法返回第一个匹配的元素。
# 查找第一个p标签
first_p = soup.find('p')
print("第一个p标签:", first_p)
print("第一个p标签内容:", first_p.get_text())
# 根据class属性查找
content_p = soup.find('p', class_='content')
print("class为content的p标签:", content_p.get_text())5.2 find_all()方法
find_all()方法返回所有匹配的元素列表。
# 查找所有p标签
all_p = soup.find_all('p')
print("所有p标签数量:", len(all_p))
# 查找所有a标签
all_a = soup.find_all('a')
print("所有链接:")
for a in all_a:
print(f"文本: {a.get_text()}, URL: {a['href']}")5.3 select()方法
select()方法使用CSS选择器来查找元素。
# 使用CSS选择器查找所有class为content的p标签
content_paragraphs = soup.select('p.content')
print("CSS选择器查找结果:")
for p in content_paragraphs:
print(p.get_text())
# 查找所有a标签的href属性
links = soup.select('a[href]')
for link in links:
print(f"链接: {link.get_text()}, URL: {link['href']}")6 BeautifulSoup的遍历方法
6.1 遍历子节点
# 获取body标签
body_tag = soup.body
# 遍历body的所有直接子节点
print("body的直接子节点:")
for child in body_tag.children:
if child.name:
print(child.name)6.2 遍历后代节点
# 遍历body的所有后代节点
print("body的所有后代节点:")
for descendant in body_tag.descendants:
if descendant.name:
print(descendant.name)7 BeautifulSoup的属性操作
7.1 获取标签属性
# 获取第一个a标签的href属性
first_link = soup.find('a')
print("第一个链接的URL:", first_link['href'])
print("第一个链接的class:", first_link['class'])
# 使用get()方法获取属性
print("使用get()获取URL:", first_link.get('href'))
print("获取不存在的属性:", first_link.get('target', '默认值'))7.2 修改标签属性
# 修改a标签的href属性
first_link['href'] = 'http://example.com/new_link'
print("修改后的URL:", first_link['href'])
# 添加新属性
first_link['target'] = '_blank'
print("添加target属性:", first_link['target'])8 实际应用示例
8.1 解析简单HTML页面
html = """
<!DOCTYPE html>
<html>
<head>
<title>测试页面</title>
</head>
<body>
<h1>欢迎来到测试页面</h1>
<div class="container">
<h2>文章列表</h2>
<ul class="article-list">
<li class="article-item">
<a href="/article/1">文章1</a>
<p>文章1的简介</p>
</li>
<li class="article-item">
<a href="/article/2">文章2</a>
<p>文章2的简介</p>
</li>
<li class="article-item">
<a href="/article/3">文章3</a>
<p>文章3的简介</p>
</li>
</ul>
</div>
</body>
</html>
"""
soup = BeautifulSoup(html, 'lxml')
# 获取页面标题
print("页面标题:", soup.title.string)
# 获取所有文章标题和链接
article_items = soup.select('li.article-item')
print("\n文章列表:")
for item in article_items:
title = item.find('a').string
link = item.find('a')['href']
summary = item.find('p').string
print(f"标题: {title}, 链接: {link}, 简介: {summary}")8.2 结合requests库爬取网页
import requests
from bs4 import BeautifulSoup
# 注意:这里只是示例,实际爬取请遵守爬虫伦理和法律
# response = requests.get('https://example.com')
# soup = BeautifulSoup(response.text, 'lxml')
# 模拟一个响应
mock_response = """
<html>
<head><title>示例网站</title></head>
<body>
<h1>示例网站标题</h1>
<p>这是一个示例网站的内容。</p>
<a href="https://example.com/page1">页面1</a>
<a href="https://example.com/page2">页面2</a>
</body>
</html>
"""
soup = BeautifulSoup(mock_response, 'lxml')
print("页面标题:", soup.title.string)
print("页面内容:", soup.find('p').get_text())
print("链接:", [a['href'] for a in soup.find_all('a')])9 总结
BeautifulSoup是一个功能强大的HTML解析库,它能够帮助我们轻松地从HTML文档中提取数据。通过本集的学习,我们了解了:
- BeautifulSoup的基本概念和安装方法
- BeautifulSoup的常用对象类型(Tag、NavigableString、BeautifulSoup)
- 查找元素的方法(find()、find_all()、select())
- 遍历文档树的方法
- 标签属性的操作
- 实际应用示例
下一集我们将学习BeautifulSoup的高级用法,进一步提升我们的网页解析能力。