Python Beautiful Soup 刮取简易指南
创始人
2024-03-02 09:28:37
0

Python 中的 Beautiful Soup 库可以很方便的从网页中提取 HTML 内容。

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

什么是 Web 刮取,为什么我需要它?

答案很简单:并非每个网站都有获取内容的 API。你可能想从你最喜欢的烹饪网站上获取食谱,或者从旅游博客上获取照片。如果没有 API,提取 HTML(或者说 刮取 scraping 可能是获取内容的唯一方法。我将向你展示如何使用 Python 来获取。

并非所以网站都喜欢被刮取,有些网站可能会明确禁止。请于网站所有者确认是否同意刮取。

Python 如何刮取网站?

使用 Python 进行刮取,我们将执行三个基本步骤:

  1. 使用 requests 库获取 HTML 内容
  2. 分析 HTML 结构并识别包含我们需要内容的标签
  3. 使用 Beautiful Soup 提取标签并将数据放入 Python 列表中

安装库

首先安装我们需要的库。requests 库从网站获取 HTML 内容,Beautiful Soup 解析 HTML 并将其转换为 Python 对象。在 Python3 中安装它们,运行:

pip3 install requests beautifulsoup4

提取 HTML

在本例中,我将选择刮取网站的 Techhology 部分。如果你跳转到此页面,你会看到带有标题、摘录和发布日期的文章列表。我们的目标是创建一个包含这些信息的文章列表。

网站页面的完整 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 中提取内容

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

如果你浏览 HTML,你会发现靠近顶部的这一段:


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

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

#!/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

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

[{'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 构建了一个网络刮取器,你可以在 我的示例仓库中找到源代码

总结

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

玩的开心,继续编码吧。

本文最初发表在作者个人博客上,经授权改编。


via: https://opensource.com/article/21/9/web-scraping-python-beautiful-soup

作者:Ayush Sharma 选题:lujun9972 译者:MjSeven 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

相关内容

python基础语法【迭代...
1.迭代器 1.什么是迭代器(iter)...
2025-06-01 20:30:55
手把手教你使用Flask框...
目录前言0、Flask框架的详细介绍一、Flask 框架封装接口1...
2025-06-01 17:11:00
【练习题】python函数...
写一个匿名函数,判断指定的年是否是闰年 (先直接用普...
2025-06-01 15:13:03
4年功能测试,我一进阶py...
目录:导读前言一、Python编程入门到精通二、接口...
2025-06-01 13:34:04
Python嵌套函数(Ne...
Python嵌套函数(Nested function...
2025-06-01 12:52:54
python 基础系列篇:...
python 基础系列篇:三、认识函数、方法...
2025-06-01 09:29:50

热门资讯

Helix:高级 Linux ... 说到 基于终端的文本编辑器,通常 Vim、Emacs 和 Nano 受到了关注。这并不意味着没有其他...
使用 KRAWL 扫描 Kub... 用 KRAWL 脚本来识别 Kubernetes Pod 和容器中的错误。当你使用 Kubernet...
JStock:Linux 上不... 如果你在股票市场做投资,那么你可能非常清楚投资组合管理计划有多重要。管理投资组合的目标是依据你能承受...
Epic 游戏商店现在可在 S... 现在可以在 Steam Deck 上运行 Epic 游戏商店了,几乎无懈可击! 但是,它是非官方的。...
《Apex 英雄》正式可在 S... 《Apex 英雄》现已通过 Steam Deck 验证,这使其成为支持 Linux 的顶级多人游戏之...
从 Yum 更新中排除特定/某... 作为系统更新的一部分,你也许需要在基于 Red Hat 系统中由于应用依赖排除一些软件包。如果是,如...
通过 SaltStack 管理... 我在搜索Puppet的替代品时,偶然间碰到了Salt。我喜欢puppet,但是我又爱上Salt了:)...
如何在 Github 上创建一... 学习如何复刻一个仓库,进行更改,并要求维护人员审查并合并它。你知道如何使用 git 了,你有一个 G...
Opera 浏览器内置的 VP... 昨天我们报道过 Opera 浏览器内置了 VPN 服务,用户打开它可以防止他们的在线活动被窥视。不过...
如何检查你的 Linux 系统... 不知道在使用哪个初始化系统?以下是方法。每个主流 Linux 发行版(包括 Ubuntu、Fedor...