这次主要介绍 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("网页请求失败")
Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐