如何使用 BeautifulSoup 在 Python 上进行网络搜索?

作者 :

反应 :

评论

您是否想潜入...... 网络搜刮 但又不会被复杂的代码所困扰?

Python 和图书馆 美丽汤,你可以轻松地 提取和整理数据 仅用几句话就能概括一个网站。

使用 BeautifulSoup 在 Python 上进行网络搜刮。
使用 BeautifulSoup 在 Python 上进行网络搜刮。Cristina for Alucare.fr

使用 BeautifulSoup 在 Python 上进行刮擦的先决条件

✅ 在开始之前,掌握以下几点至关重要: 编程基础.这将让您更好地了解代码是如何工作的。 不必成为专家,但懂得阅读和执行Python脚本会对你大有帮助。

接下来,您首先需要做的是 使 在 Python 上进行刮擦 与 BeautifulSoup :

  • ✔ 安装 Python 以及一个开发环境。
  • ✔ 安装 核心, 这款工具可轻松添加 Python 库。
  • ✔ 安装 美丽汤 使用命令 :
pip install beautifulsoup4
  • ✔ 安装 要求 命令来检索网页:
pip install requests

如何使用 Python 和 BeautifulSoup 进行网络搜索?

请按照我们的教程进行简单的网络搜索项目。

图片展示了如何使用 BeautifulSoup 在 Python 上进行网络搜索。
图片展示了如何使用 BeautifulSoup 在 Python 上进行网络搜索。Cristina for Alucare.fr

项目 获取页面标题及其包含的所有链接。

步骤 1:通过请求检索页面内容

开展 HTTP GET 请求 到 URL,使用 要求.

使用请求发送 HTTP 请求时,服务器总是会返回一个状态代码。这些代码表示请求是否成功。

200 成功。
301 / 302 重定向。
404 未找到页面。
500 内部服务器错误。

要求您可以通过属性来验证查询结果。 .status_code.下面是一个向以下设备发送请求的代码示例 bonjour.com会检查状态代码,并在一切正常的情况下显示 HTML 内容摘要:

进口请求

# 目标 URL
url = "https://bonjour.com"

# 发送 GET 请求
response = requests.get(url)

# 检查状态代码
if response.status_code == 200:
    print("Success: the page has been retrieved!")
    html = response.text # 页面的 HTML 内容
    print("HTML 内容摘要:")
    print(html[:500]) # 只显示前 500 个字符
else:
    print(f "错误:状态代码 {response.status_code}")
  

步骤 2:使用 BeautifulSoup 分析 HTML 代码

当您使用 要求 (response.text),就会得到一个包含页面所有 HTML 代码的字符串。要轻松操作这些 HTML 代码,我们可以使用 美丽汤 创建对象 美丽汤.
将原始 HTML 传递给 BeautifulSoup 时,需要指定一个 解析器 (例如: "html.解析器这使得BeautifulSoup能够正确解析HTML并避免警告。
从 bs4 导入 BeautifulSoup
导入请求

url = "https://bonjour.com"
response = requests.get(url)
html = response.text

# 建议指定解析器
soup = BeautifulSoup(html, "html.parser")

步骤 3:查找和提取元素

将 HTML 转换为 美丽汤您就可以开始搜索和检索您感兴趣的数据(HTML 标记)。

  • 使用 查找()find_all()
# 检索标题 <h1>
h1 = soup.find("h1")
print(h1.get_text())

# 读取所有链接 <a>
liens = soup.find_all("a")
for lien in liens:
    print(lien.get_text(), lien.get("href"))
  • 按属性定位元素

您可以通过以下属性缩小搜索范围 班级, ID 或任何其他 HTML 属性。

⚠️ 评论 在 Python 中,我们写道 类别_ 代替 班级 以避免与保留字 班级.

# 检索具有特定 id 的 div
container = soup.find("div", id="main")

# 检索具有特定类的所有链接
nav_links = soup.find_all("a", class_="nav-link")
  • 使用 CSS 选择器 选择()

要进行更精确的搜索,请使用 选择() 使用 CSS 选择器。

# 文章标题中的所有链接
article_links = soup.select("article h2 a")

# 全部 <a> 其 href 属性以 "http "开头。
links_http = soup.select('a[href^="http"]')

CSS 选择器 如果想精确定位页面中的某些部分而不必手动遍历整个HTML代码,这些方法非常强大。

如何使用BeautifulSoup从HTML表格中提取数据?

使用 BeautifulSoup 从 HTML 表格中提取数据。
使用BeautifulSoup从HTML表格中提取数据。©Christina为Alucare.fr

到目前为止,我们已经了解了如何从网页中提取标题、链接或文本。

⚠ 但实际应用场景往往更为复杂: 结构化数据提取 例如表格或列表的处理、分页管理,以及解决与网页抓取相关的常见错误。这正是我们将要共同探讨的内容。

提取表格和列表

网站通常以 HTML 表格 (<table>, <tr>, <th>, <td>)或 列表 (

    /
    1. )。要将这些结构转化为可用数据,您需要学习如何逐行或逐个元素地查看它们。

      无论何时 提取 HTML 表格原理很简单:

      • ✅ 恢复标头 (<th>) 来标识列标题。
      • ✅ 浏览每一行 (<tr>) 并搜索单元格 (<td>),其中包含真实数据。
      • ✅ 在列表或字典中存储信息。

      对于一个 HTML 列表 (

        1. ) :

          • ✅ 找到所有标签
          • 查找全部.
          • ✅ 检索其内容(文本或链接)并将其添加到 Python 列表中。

          总之 :

          标签 <table>, <tr>, <th>, <td> 用于重建表格。
          标签 <ul/

            ,
          1. 用于将 HTML 列表转换为 Python 列表。

            下面是一个表格示例:

            html = """
            <table>
              <tr>
                <th>姓</th>
                <th>年龄</th>
                <th>镇</th>
              </tr>
              <tr>
                <td>爱丽丝</td>
                <td>25</td>
                <td>巴黎</td>
              </tr>
              <tr>
                <td>鲍勃</td>
                <td>30</td>
                <td>里昂</td>
              </tr>
            </table>
            """
            
            # 创建 BeautifulSoup 对象
            soup = BeautifulSoup(html, "html.parser")
            
            # 从数组中提取标题
            headers = [th.get_text(strip=True) for th in soup.find_all("th")] 头信息
            print("Headers:", headers)
            
            # 提取数据行(跳过第一行,因为这些是标题)
            行 = []
            for tr in soup.find_all("tr")[1:]:
                cells = [td.get_text(strip=True) for td in tr.find_all("td")
                if cells:
                    rows.append(cells)
            
            print("Lines :", rows)
            

            给你 find_all("th") 检索标题和 find_all("td") 检索每一行中的单元格。我们循环 <tr> 来逐行重建表格。

            下面是一个基于列表的示例:

            从 bs4 导入 BeautifulSoup
            
            html_list = """
            <ul
              
          2. 苹果</li
          3. 香蕉</li
          4. 橘子</li </ul """ soup = BeautifulSoup(html_list, "html.parser") # 从列表中读取项目 items = [li.get_text(strip=True) for li in soup.find_all("li")] 从列表中提取条目 print("Extracted list:", items) # ["苹果"、"香蕉"、"橙子"] #
          5. 在这里,每个

          6. 直接转换为 Python 列表项,结果是 ["苹果"、"香蕉"、"橙子"].

            管理分页和链接

            通常情况下,数据不适合放在一页纸上。使用 “下一页” 或一个 编号分页 (页=1,页=2,......)。

            在这两种情况下,您必须 卷曲 (循环浏览)来获取所有页面并合并数据。

            带有页面参数的示例 :

            导入时间
            导入请求
            从 bs4 导入 BeautifulSoup
            
            # 带分页的 URL 示例
            base_url = "https://bonjour.com/articles?page={}"
            HEADERS = {"User-Agent": "Mozilla/5.0"}
            
            all_articles = []
            
            # 假定有 5 个页面需要浏览
            for page in range(1, 6):
                url = BASE_URL.format(page)
                r = requests.get(url, headers=HEADERS, timeout=20)
                if r.status_code == 200:
                    soup = BeautifulSoup(r.text, "html.parser")
                    # 提取文章标题
                    articles = [h2.get_text(strip=True) for h2 in soup.find_all("h2", class_="title")] All_articles.extend(articles)
                    all_articles.extend(articles)
                else:
                    print(f "页面 {page} 出错(代码:{r.status_code})")
                time.sleep(1.0) # politeness
            
            print("Articles retrieved:", all_articles)

            简要说明:

            • 准备URL时使用位置{}来插入页面编号。
            BASE_URL = "https://bonjour.com/articles?page={}
            • 某些网站会阻止没有“浏览器标识”的请求。添加User-Agent可避免被误认为是机器人。
            headers = {"User-Agent": "Mozilla/5.0"}
            requests.get(url, headers=headers) 
            • 从第 1 页循环至第 5 页。
            for page in range(1, 6):
            • 从页面中读取 HTML。
            requests.get(url)
            • 如果网站没有回应,则限制等待时间。
            requests.get(url, timeout=20)
            • 解析器 la 页面。
            BeautifulSoup(response.text, "html.parser")
            • 获取所有文章标题。
            find_all("h2", class_="title")
            • 将找到的项目添加到全局列表中。
            all_articles.extend(articles)
            • 每次请求之间暂停一下,以免服务器超负荷运行,也可避免被禁言。
            time.sleep(1.0)
            • 循环之后 所有文章 载有 全部 5 页标题.

            常见错误和挑战

            ❗ 抓取数据并非总是按下按钮就能万事大吉。您可能会频繁遇到以下障碍:

            • HTTP 错误

            404 页面未找到
            403 无访问
            500 服务器端错误

            例子 :

            response = requests.get(url)
            if response.status_code == 200:
                # 页面确定
                print("Page retrieved successfully")
            elif response.status_code == 404:
                print("Error: page not found")
            else:
                print("Code returned:", response.status_code)
            
            • 阻止刮擦的网站

            某些系统会检测自动请求并阻止访问。

            • 动态页面(JavaScript)

            BeautifulSoup 只能读取静态 HTML。如果页面加载其 内容与 JavaScript你什么也看不到。

            在这种情况下,使用以下工具 在哪里 编剧.

            但是,如果您想在不被阻止或不损害网站的情况下有效地进行刮擦,以下是最佳做法:

            • ✔ 尊重 robots.txt 文件 一个网站。
            • ✔ 设置 期限 以避免服务器超载(使用 time.sleep())。
            • ✔ 使用 代理 并旋转它们。
            • ✔ 定期更换您的 用户代理.

            如何使用 Selenium 和 BeautifulSoup 对网络进行扫描?

            在 Chrome 浏览器上使用 Selenium 和 BeautifulSoup 进行网络刮擦。
            在 Chrome 浏览器上使用 Selenium 和 BeautifulSoup 进行网络刮擦。Cristina for Alucare.fr

            提醒 BeautifulSoup 是一款出色的 HTML 解析器,但它无法执行网页中的 JavaScript。这时 Selenium 就成了你的得力助手!

            基本上,硒 控制真实浏览器它执行 JavaScript 并显示页面,就像人在浏览一样。页面完全呈现后,BeautifulSoup 将解析 HTML 代码。因此,您可以提取您想要的内容。

            第 1 步:安装 Selenium 和 BeautifulSoup

            在这里,我们将使用 要安装它,必须通过 核心.

            pip install selenium beautifulsoup4 

            接下来,您需要下载并安装 WebDriver 与浏览器版本相对应(例如,ChromeDrive 适用于 Google Chrome 浏览器)。

            ✅ 您可以将其放置在与 Python 脚本相同的文件夹中,或者将其添加到环境变量 PATH 中 您的系统。

            步骤 2:配置 Selenium

            首先,您需要导入 webdriver 来控制浏览器。

            from selenium import webdriver
            from selenium.webdriver.common.by import By 

            随后启动浏览器。它将打开网页并 将执行 JavaScript (例如:Chrome 浏览器)。

            driver = webdriver.Chrome() 

            您告诉浏览器要访问哪个页面。

            driver.get("https://www.exemple.com") 

            如果页面显示某些元素需要时间,您可以让Selenium稍等片刻。

            driver.implicitly_wait(10) 

            步骤 3:检索页面内容

            页面加载完毕后,您可以检索 完整 DOM (执行 JS 后的 HTML 源代码)。

            html_content = driver.page_source 

            步骤 4:使用 BeautifulSoup 进行 HTML 分析

            现在将此源代码传递给BeautifulSoup以便进行处理:

            from bs4 import BeautifulSoup # 创建 BeautifulSoup 对象 soup = BeautifulSoup(html_content, 'html.parser') # 示例:获取页面上的所有标题 titles = soup.find_all('h2') for title in titles: print(title.get_text()) 

            👉 BeautifulSoup 提供了强大的方法,如 find()、find_all() 和 CSS 选择器,可用于 目标提取元素 HTML 代码。

            步骤 5:关闭浏览器

            非常重要:执行后请务必关闭浏览器以释放资源!

            driver.quit() 

            ✅ 就是这样!现在,您可以将 Selenium 的强大功能与 模拟人类导航 (点击、滚动等)与BeautifulSoup在HTML代码解析方面的效率相结合。

            常见问题

            用 Python 进行网络搜索的最佳工具是什么?

            实际上并不存在真正的最佳通用工具,而是根据您的项目量身定制的解决方案。

            🔥 美丽汤 HTML 解析器:简单有效,可快速分析 HTML 并提取内容。如果你刚起步或有小型项目,它是你的理想选择。

            🔥 废料 这是一个完整的框架,旨在通过先进功能管理海量数据。

            🔥 编剧 : 非常适合由JavaScript生成的复杂网站,因为它模拟真实浏览器,并能像人类一样与页面进行交互。

            如何使用 BeautifulSoup 从标签中提取内容 <div> ?

            使用 BeautifulSoup,您可以使用 CSS 选择器.要从 <div>步骤如下

            1. 使用 Requests 检索页面,然后使用 BeautifulSoup 进行分析
            从 bs4 导入 BeautifulSoup
            导入请求
            
            url = "URL_OF YOUR_SITE" # 替换为真实 URL
            response = requests.get(url)
            html_content = response.text
            
            soup = BeautifulSoup(html_content, "html.parser")
            1. 使用 选择() 标签,将您的 CSS 选择器传递给它,使其针对 <div>

            要检索第一个项目,请使用 soup.select_one
            要检索所有项目,请使用 汤.选择

            HTML 示例:

            <div class="article">
              <h2>文章标题</h2>
              <p>该段是这样说的</p>
            </div>

            使用 CSS 的示例:

            # 读取第一个带有 "article "类的 div
            div_article = soup.select_one("div.article")
            
            # 显示其文本内容
            
            print(div_article.get_text(strip=True))

            这里的 CSS 选择器是 div.article.

            1. 提取内部元素 <div>
            # 检索 div 中的标题
            title = soup.select_one("div.article h2").get_text()
            
            # 从 div 中读取段落
            paragraph = soup.select_one("div.item p").get_text()
            
            print("Title:", title)
            print("Paragraph:", paragraph)

            如何一起使用 Requests 和 BeautifulSoup?

            这两个图书馆相辅相成。

            1. Requests 通过 HTTP 请求获取网页内容。

            它向目标网站发送 HTTP 请求,下载页面的原始 HTML 代码。

            进口请求
            
            url = "https://sitecible.com"
            response = requests.get(url) # HTTP 请求
            print(response.text) # 显示原始 HTML 代码

            在这一阶段,你所拥有的只是一个充满标记的巨大文本 (<html>,<div><p>等等)。

            1. BeautifulSoup 会分析这些 HTML 内容,提取您感兴趣的内容。

            它将原始HTML转换为有组织的结构。通过这种方式,您可以轻松地在HTML内部进行导航:定位、提取和获取数据。

            从 bs4 导入 BeautifulSoup
            
            soup = BeautifulSoup(response.text, "html.parser") # 解析 HTML
            title = soup.find("h1").get_text() # 提取了一个 <h1>
            print(title)

            为什么我的网络搜刮代码在某些网站上不起作用?

            您的脚本可能无法检索到任何内容,因为有些网站并不直接以 HTML 格式提供所有内容。

            这些网站使用JavaScript动态加载数据。然而,BeautifulSoup无法实现分析 JavaScript 渲染的数据.

            在这种情况下,您应该使用以下工具 编剧 在哪里 .

            BeautifulSoup 在网络搜刮中扮演什么角色?

            BeautifulSoup扮演着HTML 解析器.

            它将页面源代码以纯文本形式获取,并将其转换为结构化对象,便于您轻松浏览。

            如果没有这个库,您将看到一大块无法阅读的文本。简而言之,BeautifulSoup 是在 普通 HTML 和您的 Python 代码.

            网络搜刮:BeautifulSoup 与 Scrapy?

            美丽汤废料 虽然两者都用于网络搜刮,但却截然不同。

            美丽汤 废料
            一个仅用于解析 HTML 和提取数据的简单库。 管理整个搜索过程的完整框架
            (查询、链接跟踪、分页、数据导出、错误管理)。

            简而言之,BeautifulSoup 使...变得更容易。用 Python 提取 HTML 数据.该库非常适合初学者,因为它能让刮削变得快速而简单。

            否则,如果您不想 无编码, 功能全面的工具 亮数据 也是网络搜刮的绝佳解决方案。

            现在,请在评论中告诉我们你都搜刮到了什么!

喜欢吗?分享它!

这些内容最初是 法语 (请参见下面的编辑器)。为了向尽可能多的国家提供帮助,我们使用 Deepl 和/或谷歌翻译 API 对该网站进行了多种语言的翻译和校对。我们每月的翻译费用高达数千欧元。如果它不是 100 % 完美,请给我们留言,以便我们进行修正。如果您对校对和提高翻译文章的质量感兴趣,请使用联系表格向我们发送电子邮件!
我们感谢您的反馈意见,以改进我们的内容。如果您想提出改进建议,请使用我们的联系表或在下面留言。 您的意见有助于我们提高网站质量 Alucare.fr


Alucare 是一家独立媒体。请将我们添加到您的谷歌新闻收藏夹,以支持我们:

在讨论区发表评论