【Day 09】- 大家都爱的 BeautifulSoup

前情提要

前一篇文章带大家看了Requests-HTML 库的使用,用他来做资料清洗使我们真正想要的资料能够从一堆资料内被清理出来。

开始之前

Requests 库本身不具有资料清洗的功能,需要其他工具来辅助清理,今天要来介绍有名的 BeautifulSoup 这个套件 。

BeautifulSoup 是一个 Python 的函式库,可以从 HTML 或 XML 档案中分析资料,也可拿来修复未闭合标签等错误的文件。

BeautifulSoup 与解析器安装

使用以下指令安装 BeautifulSoup。

pipenv install beautifulsoup4

另外,BeautifulSoup 分析资料前需要有解析器来做预处理,虽然标准函式库内有一个 html.parser 但本文会使用 html5lib 作为我们的解析器,这个的解析器的容错率较强、速度较慢,较追求速度的读者能使用其他的解析器欧。

※ 注意,因为容错率,不同解析器解析出来的资料可能会与实际的不同。如果找不到欲找的元素,能考虑换一个解析器, html5lib 是容错率最高的解析器。

使用以下指令安装 html5lib 解析器。

pipenv install html5lib

BeautifulSoup 使用

首先我们能来先解析一个 HTML ,范例中的 HTML 是 https://ithelp.ithome.com.tw/users/20134430/ironman/4307,使用 Requests 套件进行爬取,若还没看过 Requests 套件使用的读者能去看这篇 【Day 07】- 第一只网路爬虫要用什麽函式库? (Requests)

import requests
from bs4 import BeautifulSoup

url = 'https://ithelp.ithome.com.tw/users/20134430/ironman/4307'
#发送 GET 请求到 url,并将回应物件放到 resp
resp = requests.get(url)
# 将 resp.text 也就是 HTML 资料定义到 BeautifulSoup 物件内,并用 html5lib 解析 HTML 内容
soup = BeautifulSoup(resp.text, 'html5lib')

# 输出网页的 title
print(soup.title.getText())

#输出第一个寻找到的 <li> 元素的文字
print(soup.li.getText())

#输出第一个寻找到的 <li> 元素的文字(相同效果)
print(soup.find('li').getText())

#寻找全部 <li> 元素的文字
lis = soup.find_all('li')
for li in lis:
    print(li.getText())

取得标签属性

若想在一个标签内取得该标签的属性,只需像字典一样操作即可。

例如有个标签为 <a href='https://www.google.com'>OwO</a>soup.a['href'] 即可取得该标签的属性 https://www.google.com

import requests
from bs4 import BeautifulSoup

url = 'https://ithelp.ithome.com.tw/users/20134430/ironman/4307'
resp = requests.get(url)
soup = BeautifulSoup(resp.text, 'html5lib')

links = soup.find_all('a')
for link in links:
    if 'href' in link.attrs:
        print(link['href'])

BeautifulSoup 定位

  • soup.find() : 根据条件回传"第一个"符合的元素,由字串表示,若没有符合的则回传 None。
  • soup.find_all() : 根据条件回传"全部"符合的元素,由串列表示,若没有符合的则回传空串列。
  • soup.select() : Css Selector。

可以透过标签、 id 或 class 来定位元素, soup.find('p', id='myid', class_='myclass') ,注意 class 後方必须加上底线,为了避免与 Python 的关键字 class 冲突。

例子

假设我们想要爬取 【Day 01】- 前言: 从 0 开始的网路爬虫 的文章网址,首先先用选取工具选取该元素,发现它在 <a href="[https://ithelp.ithome.com.tw/articles/10263628](https://ithelp.ithome.com.tw/articles/10263628)" class="qa-list__title-link">【Day 01】- 前言: 从 0 开始的网路爬虫</a> ,於是我们可以开始定位此元素了。

首先观察到该标签是 并且有个 class 叫做 qa-list__title-link ,这个例子十分容易,读者可以参考下方程序码。

import requests
from bs4 import BeautifulSoup

url = 'https://ithelp.ithome.com.tw/users/20134430/ironman/4307'
resp = requests.get(url)
soup = BeautifulSoup(resp.text, 'html5lib')

link = soup.find('a', class_='qa-list__title-link')
print(link['href'].strip())

结语

今天介绍了 BeautifulSoup 这个好用的套件,并用它好用的定位功能来定位出文章网址,但它能做到的事情还远远不止如此。到现在这个阶段,读者们已经有能力去试着用 Requests+BeautifulSoup 或者 Requests-HTML 去爬取想爬取的东西了(像学校课表、股票等等)

明日内容

明天会与各位介绍爬虫的类型,可以有简单的认知对於目前的爬虫是哪一个种类,以及对应目前的状况使用哪种会比较合适。

补充资料

html.parser 官方文件 : https://docs.python.org/zh-tw/3/library/html.parser.html

[Python爬虫教学]7个Python使用BeautifulSoup开发网页爬虫的实用技巧 : https://www.learncodewithmike.com/2020/02/python-beautifulsoup-web-scraper.html

Python 网路爬虫Web Crawler教学 — Beautiful Soup篇 : https://seanchien0525.medium.com/python-requests-beautifulsoup-爬虫教学-83d146faa9e8


<<:  Day12 - 辨识模型 part1

>>:  Day9 Micro LED对LCD和OLED来说就是一个高富帅和两个矮穷丑的比较?简单介绍首款使用Micro LED的AR眼镜

[Part 1 ] Vue.js 的精随-元件

前言 接下来多篇的元件介绍会以官方文件 Components In-Depth 章节为主: 未知pa...

day28 等一下啦,会坏掉的/// Coroutine并发操作的重复请求

没有要开车,参赛规定有写不能污言秽语,等我有空再去其他平台写个开车系列的coroutine 这里给个...

[Cmoney 菁英软件工程师战斗营] IOS APP 菜鸟开发笔记(4)

前言 之前po过部分swift语法的笔记,以下再附上近期整理好的部分 类别(class) class...

[Day12] - 利用 Button 范例 - 解说直接修改 Dom 与 data-binding 的差异

在 React 跟 Vue 中我们可以较为轻松的利用资料 来做 render 对应的话画面生出来 不...

使用auto-sklearn demo AutoML

上一篇说明了Auto ML的基本概念, 本篇我们就来使用auto sklearn实作看看 Auto ...