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

作者 :

反应 :

评论

制作 网络搜刮 用Python实现 BeautifulSoup, ,你需要两个库: requests 下载该网页,以及 beautifulsoup4 用于从HTML代码中提取数据。.

使用以下命令安装它们 pip install requests beautifulsoup4, ,然后按照下面的指南,一步一步地对网站进行数据抓取。.

使用BeautifulSoup进行网页抓取的Python脚本,用于从网页中提取数据
使用 BeautifulSoup 在 Python 上进行网络搜刮。Cristina for Alucare.fr

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

在开始之前,你不必是专家。只要懂得阅读并执行脚本即可 Python 对于初学者来说,这已经绰绰有余了。.

以下是开始使用所需安装的内容:

  • 安装 Python 以及一个开发环境。
  • 安装 pip, ,这是一款只需一条命令即可添加 Python 库的工具。.
  • 安装 BeautifulSoup :
pip install beautifulsoup4

请注意包名:在 PyPI, 没错 beautifulsoup4 需要编写的内容。你将导入到代码中的模块名为 bs4.

  • 安装 Requests 下载网页:
pip install requests
  • 安装 lxml (可选),BeautifulSoup 用于解析 HTML 的一个更快的解析器:
pip install lxml

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

以下是一个完整的项目,用于恢复 标题 一个网页以及所有 链接 其中包含的内容。.

使用BeautifulSoup库进行HTML数据抓取的Python脚本
使用Python进行网页抓取 BeautifulSoup. ©Christina 供 Alucare.fr 使用

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

要下载一个网页,你需要发送一个 HTTP GET 请求 指向一个URL。这是该库的作用 Requests.

每次请求时,服务器都会返回一个 状态代码 它会告诉你一切是否顺利。需要了解的主要内容:

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

和 Requests, 你可以通过该属性来验证该结果 .status_code. 下面是一个具体示例:这段代码会向某个网站发送请求,检查状态码,如果一切正常,则显示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代码 来自该页面,但目前无法直接使用。为了方便操作,你可以创建一个对象 BeautifulSoup, ,它会将这种原始HTML转换为一种你可以浏览和分析的结构。.

始终表示一个 解析器, ,例如 "html.解析器. 此时,BeautifulSoup 会正确解析 HTML,且不会显示任何警告。你也可以使用 lxml, ,速度更快,需单独安装。.

从 bs4 导入 BeautifulSoup
导入请求

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

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

步骤 3:查找和提取元素

现在,HTML 已成为一个 BeautifulSoup 对象。你可以搜索并提取 数据 你感兴趣的,逐个标签查看。三种方法足以满足大多数需求。.

使用 find() 和 find_all()

查找() 返回 第一个要素 找到了。. 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"))

按属性定位元素

你可以根据某个 HTML 属性来细化搜索,例如 班级, ID 或者任何其他。. 要注意 : 在 Python 中,我们这样写 类别_ 和不 班级, ,以避免与该语言中的保留词发生冲突。.

# 获取具有特定 ID 的 div 元素
容器 = soup.find("div",)

# 获取所有具有特定类的链接
导航链接 = soup.find_all("a", class_="nav-link")

使用 select() 调用 CSS 选择器

若要进行更精准的搜索,可采用以下方法: 选择() 接受 CSS 选择器. 你可以精确定位页面中的某些部分,而无需手动遍历整个HTML代码。.

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

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

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

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

实际应用场景通常比获取标题或链接要复杂得多。你需要处理……’结构化数据提取 与表格和列表一样,该 分页, ,以及数据抓取中常见的错误。.

提取表格和列表

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

    和
  1. ). 要将这些结构转换为可用的数据,你需要逐行或逐元素地遍历它们。.

    要提取一个 HTML表格原理很简单:

    • 获取标头(<th>) 来标识列标题。
    • 遍历每一行(<tr>) 并搜索单元格 (<td>) 其中包含相关数据。.
    • 将信息存储在列表或字典中。.

    对于一个 HTML 列表 (<ul 在哪里

      ) :

      • 标记所有标签
      • 和 find_all.
      • 提取其内容(文本或链接),并将其添加到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
        
    1. 苹果</li
    2. 香蕉</li
    3. 橘子</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) # ["苹果"、"香蕉"、"橙子"] #
    4. 每个

    5. 直接转换为 Python 列表元素, ,从而得到结果 ["苹果"、"香蕉"、"橙子"].

      管理分页和链接

      通常,数据无法全部显示在一页上。这些数据会通过链接分散在 “下一页” 或一个 编号分页 (?page=1, ?page=2, ,等等)。无论哪种情况,你都必须 卷曲 以检索所有页面并合并数据。.

      以下是一个包含“page”参数的示例:

      导入时间
      导入请求
      从 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)

      简要的分步说明:

      • 准备好’网址 带一个车位 {} 用于插入页码。.
      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.
      requests.get(url)
      • 如果网站没有响应,则限制等待时间(20秒超时).
      requests.get(url, timeout=20)
      • 使用以下工具分析该页面 BeautifulSoup.
      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("页面已成功获取")
      elif response.status_code == 404:
          print("错误:页面不存在")
      else:
          print("返回状态码:", response.status_code)
      
      • 阻止刮擦的网站 :有些会检测到自动请求并阻止访问。.
      • 动态页面(JavaScript) : BeautifulSoup 只读 静态HTML. 如果页面通过 JavaScript 加载内容,你将看不到任何内容。在这种情况下,你需要使用诸如 Selenium 在哪里 Playwright.

      为了高效地进行网页抓取,同时避免被封禁或破坏网站,请遵循以下最佳实践:

      • 遵守 robots.txt 文件 你要分析的网站。.
      • 实施 期限 在查询之间使用 time.sleep() 以免给服务器造成过载。.
      • 使用 代理 并让它们转起来。.
      • 定期更换你的 User-Agent.

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

      使用Python在Chrome浏览器上通过Selenium和BeautifulSoup进行网页抓取。.
      在 Chrome 浏览器上使用 Selenium 和 BeautifulSoup 进行网络刮擦。Cristina for Alucare.fr

      Selenium 控制真实浏览器, ,执行JavaScript并以与人类浏览时相同的方式显示页面。. BeautifulSoup 随后在页面完全渲染后分析HTML,并提取你所需的所有数据。.

      第 1 步:安装 Selenium 和 BeautifulSoup

      在这里,与其说…… requests, ,你使用的是 Selenium 以获取页面内容。使用以下命令安装这两个库:

      pip install selenium beautifulsoup4

      接下来,你需要下载一个 WebDriver 已适配你的浏览器版本。对于谷歌Chrome浏览器,则是 ChromeDriver. 你有两种选择:将其放在与你的 Python 脚本相同的文件夹中,或者将其’添加到环境变量 PATH 中 你的系统。.

      步骤 2:配置 Selenium

      首先导入 webdriver 通过Selenium控制浏览器。.

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

      接着启动一个浏览器。正是它打开了该页面,并且 执行 JavaScript, ,这里是Chrome。.

      driver = webdriver.Chrome()

      告知浏览器该 网址 参观。.

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

      如果页面加载某些元素需要较长时间,你可以让Selenium等待最多 10 秒钟.

      driver.implicitly_wait(10)

      步骤 3:检索页面内容

      页面加载完成后,你获取 完整 DOM :执行 JavaScript 后生成的 HTML 源代码。.

      html_content = driver.page_source

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

      现在将这段源代码传递给 美丽汤 要利用它:

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

      BeautifulSoup 提供了诸如以下这些强大的方法: find(), find_all() 以及用于 定位和提取 HTML中的具体元素。.

      步骤 5:关闭浏览器

      非常重要:执行完毕后请务必关闭浏览器,以便 释放资源.

      driver.quit()

      这样,你就将……的强大功能结合在一起 Selenium 为了 模拟人类导航 (点击、滚动)结合BeautifulSoup高效的HTML解析能力。这是抓取通过JavaScript加载数据的网站的理想方法。.

      常见问题

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

      没有……’刮刀 并非通用的,而是更适合你项目的解决方案。以下是使用最广泛的三个:

      • BeautifulSoup :简单高效,可分析HTML并快速提取内容。如果你是初学者或正在处理小型项目,这是理想的选择。.
      • Scrapy :一个功能全面的框架,专为管理 海量数据 并具备高级功能。.
      • Playwright : 非常适合处理由JavaScript生成的复杂网站。它能模拟真实的浏览器,并像人类一样与网页进行交互。.

      如何使用 BeautifulSoup 提取 div 标签中的内容?

      和 BeautifulSoup, 你可以通过一个 CSS 选择器. 要提取标签中的内容 <div>, 请按照以下步骤操作。.

      1. 使用以下方式获取网页: requests, ,然后使用 BeautifulSoup.

      from bs4 import BeautifulSoup
      import requests
      
      url = "URL_DE_TON_SITE"  # Remplace par l'URL réelle
      reponse = requests.get(url)
      html_content = reponse.text
      
      soup = BeautifulSoup(html_content, "html.parser")

      2. 使用该方法 选择() 使用你的 CSS 选择器来定位该标签 <div>.

      要获取第一个元素,请使用 soup.select_one. 要获取所有元素,请使用 汤.选择. 以下是一个 HTML 代码示例:

      <div>
        <h2>Titre de l'article</h2>
        <p>Voici le contenu du paragraphe.</p>
      </div>

      下面是一个使用 CSS 选择器的示例 div.article :

      # Récupérer le premier div avec la classe "article"
      div_article = soup.select_one("div.article")
      
      # Afficher son contenu texte
      if div_article:
          print(div_article.get_text(strip=True))

      3. 取出内部的物品 <div>.

      # Récupérer le titre à l'intérieur du div
      titre = soup.select_one("div.article h2").get_text()
      
      # Récupérer le paragraphe à l'intérieur du div
      paragraphe = soup.select_one("div.article p").get_text()
      
      print("Titre :", titre)
      print("Paragraphe :", paragraphe)

      如何一起使用 Requests 和 BeautifulSoup?

      这两个库是 其他 :一个负责加载页面,另一个负责分析页面。.

      1. requests 发送一个HTTP请求并下载该 原始HTML代码 的页面。

      import requests
      
      url = "https://sitecible.com"
      response = requests.get(url)  # requête HTTP
      print(response.text)  # affiche le HTML brut

      目前,你只有一段布满标签的冗长文本(<html>, <div>, <p>等等)。

      2. BeautifulSoup 分析这段原始HTML代码,并将其转换为一个 有组织的结构. 然后,你可以浏览该页面,定位标签并提取数据。.

      from bs4 import BeautifulSoup
      
      soup = BeautifulSoup(response.text, "html.parser")  # analyse le HTML
      titre = soup.find("h1").get_text()  # extrait le contenu d'un <h1>
      print(titre)

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

      有时你的脚本可能无法获取任何内容。某些网站不会直接以HTML格式提供全部内容:它们使用 JavaScript 以动态加载数据。然而,, BeautifulSoup 无法分析 JavaScript 生成的数据. 在这种情况下,你需要借助诸如 Playwright 在哪里 Selenium.

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

      BeautifulSoup 扮演……的角色’HTML 解析器. 它将页面代码转换为一个结构化的对象,你可以轻松地遍历它。简而言之,这就是 在原始HTML和你的Python代码之间进行转换的工具.

      网页抓取:BeautifulSoup 还是 Scrapy?

      BeautifulSoup 和 Scrapy 确实截然不同,尽管两者都用于 网络搜刮.

      BeautifulSoup Scrapy
      一个仅用于解析 HTML 和提取数据的简单库。 一个功能齐全的框架,可管理整个爬取流程:请求、链接追踪、分页、数据导出及错误处理。.

      BeautifulSoup 是入门的不二之选:它让’用 Python 提取 HTML 数据 简单快捷。.

      如果你希望尽可能减少代码部分,那么该工具 亮数据 提供可直接使用的数据集,以减少编码工作量。.

      👍您的意见
      文章内容丰富
      文章客观
      文章回答了我的问题
      内容是最新的
      🔍 发现任何错误? 告诉我们在哪里!

喜欢吗?分享它!

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


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

在讨论区发表评论