Python 解析 HTML 文档

399 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第10天,点击查看活动详情

前言

《网页下载》一节中,我们已经学习了如何下载原始 HTML 文件,HTML 是网页中的主要语言。HTML 是一种结构化语言,使用不同元素定义文档的不同部分,例如标题 (<h1><h2>...)和段落 (<p>)。 HTML 具有层次结构,父元素中可以迭代嵌入多个子元素。

将原始文本解析为结构化文档就可以进一步从网页中自动提取信息。例如,包含在某些 HTML 元素中(例如 divh3 )的文本可能与元素是相关的。

使用 BeautifulSoup 库解析 HTML 文档

为了解析 HTML 文档,我们使用 BeautifulSoup 库将 HTML 文本解析为可以分析的内存对象。可以与其他第三方库安装方式相同的方法安装 beautifulsoup4 库:

$ pip install beautifulsoup4

导入 BeautifulSoup 和 requests 库,并定义要下载和解析的网页 URL

>>> import requests
>>> from bs4 import BeautifulSoup
>>> url = 'https://juejin.cn/user/1196744246822605'

使用 GET 请求网页 URL 下载并进行解析:

>>> response = requests.get(url)
>>> response
<Response [200]>

下载页面完成后,可以解析下载完成的页面,返回的 page 对象中包含要解析的信息:

>>> page = BeautifulSoup(response.text, 'html.parser')

html.parser 解析器是 BeautifulSoup 的默认解析器,但对于某些大型网页或具有动态刷新机制的网页来说,该解析器并不适用。我们也可以使用其他解析器,例如速度更快的 lxml,或者更接近浏览器操作方式的 html5lib,使用这些解析器,需要首先安装同名的第三方库。

获取页面的标题,可以看到其与浏览器中显示的一致:

>>> page.title
<title>盼小辉丶 的个人主页 - 动态 - 掘金</title>
>>> page.title.string
'盼小辉丶 的个人主页 - 动态 - 掘金'

查找页面中的所有 h3 元素:

>>> page.find_all('h3')
[<h3 data-v-b6babe82=""><!-- -->

          Python 网页下载
        </h3>, <h3 data-v-b6babe82=""><!-- -->

          Python 添加命令行参数
        </h3>, <h3 data-v-b6babe82=""><!-- -->

          Python 深入了解正则表达式
        </h3>, <h3 data-v-b6babe82=""><!-- -->

          Python 正则表达式基础
        </h3>, <h3 data-v-b6babe82=""><!-- -->
...

可以利用 BeautifulSoup 搜索 HTML 元素。可以使用 find() 方法搜索第一次出现的 HTML 元素,或者使用 find_all() 方法返回一个列表。

指定元素属性提取文本,并在到达下一个 <a> 元素标记时停止,使用 string 属性可以显示原始文本,不包括封闭的 HTML 标记:

>>> href_section = page.find('a',attrs={'class':"nav-item"})
>>> section = []
>>> for href in href_section.next_elements:
...     if href.name =='a':
...             break
...     section.append(href.string or '')
...
>>> result = ''.join(section)
>>> result
'商城商城   APP'

 

搜索具有特定属性 class=nav-item 的特定标记 <a>。之后,不断迭代 next_elements 直到找到下一个 a 标签。每个元素的文本被提取并组合成单个文本,使用 or 避免当元素没有文本时返回 None