Python爬虫之BeautifulSoup模块

这次主要介绍 BeautifulSoup,它是一个用于解析 HTML 和 XML 文档的 Python 库,能够从网页中提取数据,常用于网页抓取和数据挖掘。
BeautifulSoup
BeautifulSoup 是一个用于从网页中提取数据的 Python 库,适用于解析 HTML 和 XML 文件。
BeautifulSoup 能够通过提供简单的 API 来提取和操作网页中的内容,非常适合用于网页抓取和数据提取的任务。
BeautifulSoup安装
要使用 BeautifulSoup,需要安装 beautifulsoup4 和 lxml 或 html.parser(HTML 解析器)。
pip3 install beautifulsoup4
pip3 install lxml
html.parser 是 Python 内置的,无需下载。
用法
BeautifulSoup 用于解析 HTML 或 XML 数据,并提供了一些方法来导航、搜索和修改解析树。
BeautifulSoup 常见的操作包括查找标签、获取标签属性、提取文本等。
要使用 BeautifulSoup,需要先导入 BeautifulSoup,并将 HTML 网页内容加载到 BeautifulSoup 对象中。
我们可以使用爬虫库(如 requests)获取网页内容
实例
from bs4 import BeautifulSoup
import requests
# 指定你想要获取标题的网站
url = 'https://www.baidu.com/' # 抓取百度的网页内容
# 发送HTTP请求获取网页内容
response = requests.get(url)
# 中文乱码问题
response.encoding = 'utf-8'
# 确保请求成功
if response.status_code == 200:
# 使用BeautifulSoup解析网页内容
soup = BeautifulSoup(response.text, 'lxml')
# 解析网页内容 html.parser 解析器
# soup = BeautifulSoup(response.text, 'html.parser')
# 查找<title>标签
title_tag = soup.find('title')
# 打印标题文本
if title_tag:
print(title_tag.get_text())
else:
print("未找到<title>标签")
else:
print("请求失败,状态码:", response.status_code)
执行以上代码,输出标题为:
百度一下,你就知道
中文乱码问题
使用 requests 库抓取中文网页时,可能会遇到编码问题,导致中文内容无法正确显示,为了确保能够正确抓取并显示中文网页,需要处理网页的字符编码。
虽然自动检测编码 requests 通常会自动根据响应头中的 Content-Type 来推测网页的编码,但有时可能不准确,此时可以使用 chardet 来自动检测编码。
import requests
import chardet
url = 'https://cn.bing.com/'
response = requests.get(url)
# 自动检测编码
encoding = chardet.detect(x.content)['encoding']
print(f"{url}编码:", encoding)
x.encoding = encoding
执行以上代码,输出为:
utf-8
查找具有特定属性的标签
我们可以通过传递属性来查找具有特定属性的标签。
# 查找具有 class="bg s_btn" 的 <input> 标签
divs_with_class = soup.find('input', class_='bg s_btn')
实例
from bs4 import BeautifulSoup
import requests
# 指定要获取标题的网站
url = 'https://www.baidu.com/' # 抓取baidu的网页内容
# 发送HTTP请求获取网页内容
response = requests.get(url)
# 中文乱码问题
response.encoding = 'utf-8'
soup = BeautifulSoup(response.text, 'html.parser')
# 查找具有 id="unique-id" 的 <input> 标签
unique_input = soup.find('input', id='su')
input_value = unique_input['value'] # 获取 input 输入框的值
print(input_value)
输出结果为:
百度一下
获取网页中的所有链接
我们可以用 soup.find_all('a', href=True) ,获取网页中的所有链接。
实例
# 发送请求
x = requests.get("https://www.baidu.com/")
# 返回网页状态码
if status_code:
print("状态码:", x.status_code)
if x.status_code == 200:
soup = BeautifulSoup(x.text, 'html.parser')
links = [a.get('href') for a in soup.find_all('a', href=True)]
for link in links:
if link.startswith('http'):
print(link)
else:
print("网页请求失败")更多推荐
所有评论(0)