当前位置:
首页
文章
后端
详情

如何使用BeautifulSoup在Python中抓取网页内容?使用BeautifulSoup抓取网页的指南!

今天我们将讨论如何使用 BeautifulSoup 库从 HTML 页面中提取内容。提取后,我们将使用 BeautifulSoup 将其转换为 Python 列表或字典!

什么是网页抓取?

简单的答案是:并非每个网站都有用于获取内容的 API。您可能想从您最喜欢的烹饪网站获取食谱或从旅游博客获取照片。如果没有 API,提取 HTML 或抓取可能是获取该内容的唯一方法。我将向您展示如何在 Python 中执行此操作。

注意:并非所有网站都喜欢抓取,有些网站可能会明确禁止。与网站所有者核对是否可以抓取。

如何在 Python 中抓取网站?

为了让网络抓取在 Python 中工作,我们将执行 3 个基本步骤:

  1. 使用请求库提取 HTML 内容。
  2. 分析 HTML 结构并识别包含我们内容的标签。
  3. 使用 BeautifulSoup 提取标签并将数据放入 Python 列表中。

安装库

让我们首先安装我们需要的库。请求从网站获取 HTML 内容。BeautifulSoup 解析 HTML 并将其转换为 Python 对象。要为 Python 3 安装这些,请运行:

pip3 install requests beautifulsoup4

提取 HTML

在这个例子中,我将选择抓取网站的技术部分。如果您转到该页面,您将看到一个包含标题、摘录和发布日期的文章列表。我们的目标是创建一个包含该信息的文章列表。

技术页面的完整 URL 是:

https://notes.ayushsharma.in/technology

我们可以使用 Requests 从此页面获取 HTML 内容:

#!/usr/bin/python3
import requests

url = 'https://notes.ayushsharma.in/technology'

data = requests.get(url)

print(data.text)

该变量data将包含页面的 HTML 源代码。

从 HTML 中提取内容

要从 中接收到的 HTML 中提取我们的数据data,我们需要确定哪些标签具有我们需要的内容。

如果您浏览 HTML,您会在顶部附近找到此部分:

HTML:

<div>
  <a href="/2021/08/using-variables-in-jekyll-to-define-custom-content">
    <div>
      <div>
        <h5>Using variables in Jekyll to define custom content</h5>
        <small>I recently discovered that Jekyll's config.yml can be used to define custom
          variables for reusing content. I feel like I've been living under a rock all this time. But to err over and
          over again is human.</small>
      </div>
      <div>
        <small>Aug 2021</small>
      </div>
    </div>
  </a>
</div>

这是在每篇文章的整个页面中重复的部分。我们可以看到.card-title有文章标题、.card-text摘录和.card-footer > small发布日期。

让我们使用 BeautifulSoup 提取这些内容。

Python:

#!/usr/bin/python3
import requests
from bs4 import BeautifulSoup
from pprint import pprint

url = 'https://notes.ayushsharma.in/technology'
data = requests.get(url)

my_data = []

html = BeautifulSoup(data.text, 'html.parser')
articles = html.select('a.post-card')

for article in articles:

    title = article.select('.card-title')[0].get_text()
    excerpt = article.select('.card-text')[0].get_text()
    pub_date = article.select('.card-footer small')[0].get_text()

    my_data.append({"title": title, "excerpt": excerpt, "pub_date": pub_date})

pprint(my_data)

上面的代码将提取文章并将它们放入my_data变量中。我正在使用pprint漂亮打印输出,但您可以在自己的代码中跳过它。将上面的代码保存在一个名为 的文件中fetch.py,然后使用以下命令运行它:

python3 fetch.py

如果一切顺利,您应该会看到:

Python:


[{'excerpt': "I recently discovered that Jekyll's config.yml can be used to "
"define custom variables for reusing content. I feel like I've "
'been living under a rock all this time. But to err over and over '
'again is human.',
'pub_date': 'Aug 2021',
'title': 'Using variables in Jekyll to define custom content'},
{'excerpt': "In this article, I'll highlight some ideas for Jekyll "
'collections, blog category pages, responsive web-design, and '
'netlify.toml to make static website maintenance a breeze.',
'pub_date': 'Jul 2021',
'title': 'The evolution of ayushsharma.in: Jekyll, Bootstrap, Netlify, '
'static websites, and responsive design.'},
{'excerpt': "These are the top 5 lessons I've learned after 5 years of "
'Terraform-ing.',
'pub_date': 'Jul 2021',
'title': '5 key best practices for sane and usable Terraform setups'},

... (truncated)

这就是全部!在 22 行代码中,我们用 Python 构建了一个网络爬虫。您可以在我的示例 repo 中找到源代码。

结论

使用 Python 列表中的网站内容,我们现在可以用它做很酷的事情。我们可以将它作为 JSON 返回给另一个应用程序,或者使用自定义样式将其转换为 HTML。随意复制粘贴上面的代码并在您最喜欢的网站上进行试验。


免责申明:本站发布的内容(图片、视频和文字)以转载和分享为主,文章观点不代表本站立场,如涉及侵权请联系站长邮箱:xbc-online@qq.com进行反馈,一经查实,将立刻删除涉嫌侵权内容。

同类热门文章

深入了解C++中的new操作符:使用具体实例学习

C++中的new操作符是动态分配内存的主要手段之一。在程序运行时,我们可能需要动态地创建和销毁对象,而new就是为此提供了便利。但是,使用new也常常会引发一些问题,如内存泄漏、空指针等等。因此,本文将通过具体的示例,深入介绍C++中的new操作符,帮助读者更好地掌握其使用。


深入了解C++中的new操作符:使用具体实例学习

怎么用Java反射获取包下所有类? 详细代码实例操作

Java的反射机制就是在运行状态下,对于任何一个类,它能知道这个类的所有属性和方法;对于任何一个对象,都能调用这个对象的任意一个方法。本篇文章将通过具体的代码示例,展示如何通过Java反射来获取包下的所有类。


怎么用Java反射获取包下所有类? 详细代码实例操作

员工线上学习考试系统

有点播,直播,在线支付,三级分销等功能,可以对学员学习情况的监督监控,有源码,可二次开发。支持外网和局域网私有化部署,经过测试源码完整可用!1、视频点播:视频播放,图文资料,课件下载,章节试学,限时免

员工线上学习考试系统

了解Java中的volati关键字的作用 以及具体使用方法

本篇文章将和大家分享一下Java当中的volatile关键字,下面将为各位小伙伴讲述volatile关键字的作用以及它的具体使用方法。


了解Java中的volati关键字的作用 以及具体使用方法

Java Map 所有的值转为String类型

可以使用 Java 8 中的 Map.replaceAll() 方法将所有的值转为 String 类型: 上面的代码会将 map 中所有的值都转为 String 类型。 HashMap 是 Java

Java Map 所有的值转为String类型