BeautifulSoup 入门教程(上)
_Star_Universe_ · · 科技·工程
前言
Python 爬虫(Web Scraping)是指通过编写 Python 程序从互联网上自动提取信息的过程。
爬虫的基本流程通常包括发送 HTTP 请求获取网页内容、解析网页并提取数据,然后存储数据。
Python 的丰富生态使其成为开发爬虫的热门语言,特别是由于其强大的库支持。
BeautifulSoup
概念
BeautifulSoup 是一个用于从网页中提取数据的 Python 库,特别适合解析 HTML 和 XML 文件。
BeautifulSoup 能够通过提供简单的 API 来提取和操作网页中的内容,非常适合用于网页抓取和数据提取的任务。
一般地,Python 爬虫的流程可分为:
- 发送 HTTP 请求
- 解析 HTML 内容
- 提取数据
- 存储数据
为了便于读者理解,我把代码拆开逐个讲解。
安装
如果使用 BeautifulSoup,需要安装 beautifulsoup4
和 lxml
或 html.parser
。
具体安装方式看这里。
基本用法
爬虫的常见操作包括:
- 查找标签
- 获取标签属性
- 提取文本
通常,你会使用爬虫库(如 requests
)获取网页内容。
from bs4 import BeautifulSoup
import requests
# 使用 requests 获取网页内容
url = 'https://www.baidu.com/?a=1'
response = requests.get(url)
# 使用 BeautifulSoup 解析网页
soup = BeautifulSoup(response.text, 'lxml') # 使用 lxml 解析器
# 解析网页内容 html.parser 解析器
# soup = BeautifulSoup(response.text, 'html.parser')
举个例子,如果你要获取 https://www.baidu.com/?a=1
的标题 title
,则有如下代码:
from bs4 import BeautifulSoup
import requests
# 指定你想要获取标题的网站
url = 'https://www.baidu.com/?a=1'
# 发送 HTTP 请求
response = requests.get(url)
# 中文乱码问题
response.encoding = 'utf-8'
# 判断请求是否成功
if response.status_code == 200:
soup = BeautifulSoup(response.text, 'lxml')
# 查找 <title> 标签
title_tag = soup.find('title')
# 打印标题文本
if title_tag:
print(title_tag.get_text())
else:
print("未找到 <title> 标签")
else:
print("请求失败") # 状态码一般为 403/404
很显然,输出的 title
就是 百度一下,你就知道
。
中文乱码问题
使用 requests
库抓取中文网页时,可能会遇到编码问题,导致中文内容无法正确显示,为了确保能够正确抓取并显示中文网页,通常需要处理网页的字符编码。
此时我们可以使用 chardet
自动检测编码:
import requests
import chardet # 使用 chardet 自动检测编码
url = 'https://cn.bing.com/'
response = requests.get(url)
encoding = chardet.detect(response.content)['encoding']
print(encoding)
response.encoding = encoding
如果你知道你所访问的网页的编码规则,可以直接设置 response.encoding
:
response.encoding = 'utf-8' # 或者 gbk
查找标签
进入本文的重点了。
BeautifulSoup 提供了多种方法来查找网页中的标签,最常用的包括以下两种:
find()
返回第一个匹配的标签find_all()
返回所有匹配的标签
from bs4 import BeautifulSoup
import requests
url = 'https://www.baidu.com/'
response = requests.get(url)
response.encoding = 'utf-8'
soup = BeautifulSoup(response.text, 'lxml')
# 查找第一个 <a> 标签
first_link = soup.find('a')
print(first_link)
print("——————————————")
# 获取第一个 <a> 标签的 href 属性
# first_link_url = first_link.get('href')
# print(first_link_url)
# print("——————————————")
# 查找所有 <a> 标签
all_links = soup.find_all('a')
print(all_links)
看着输出结果,你的脑子一定在嗡嗡响,这一大坨是什么啊?我要的东西不是这个!别急,下一框就来处理。
获取标签的文本
通过 get_text()
方法,你可以提取标签中的文本内容:
from bs4 import BeautifulSoup
import requests
url = 'https://www.baidu.com/'
response = requests.get(url)
response.encoding = 'utf-8'
soup = BeautifulSoup(response.text, 'lxml')
paragraph = soup.find('p')
paragraph_text = paragraph.get_text()
# 获取页面中所有文本内容
all_text = soup.get_text()
print(all_text)
这是获取文本的方法,有时你可能需要提取属性(如 href
),那么只要把 get_text()
换掉就行。
后记
致谢:本文引用了(有的稍作修改)大量来自 RUNBOO 的文字介绍以及代码,因为作者以前留下的博客年久失修,在此对该网站提供的学习资源表示万分感谢。如果你作为这篇参考资料的原作者不希望我引用这些内容,请联系我撤下文章并道歉。
参考资料(比较长,慎入):
- Python 爬虫详解(CSDN 博客)
- Python 爬虫笔记汇总(知乎专栏)
BeautifulSoup 的用法远不止这些,本文介绍的只是最基础的一部分,更多功能将于下一期介绍,敬请期待!