Python 解析 HTML 文档
前言
在《网页下载》一节中,我们已经学习了如何下载原始 HTML 文件,HTML 是网页中的主要语言。HTML
是一种结构化语言,使用不同元素定义文档的不同部分,例如标题 (<h1>
、<h2>
...)和段落 (<p>
)。 HTML
具有层次结构,父元素中可以迭代嵌入多个子元素。
将原始文本解析为结构化文档就可以进一步从网页中自动提取信息。例如,包含在某些 HTML
元素中(例如 div
或 h3
)的文本可能与元素是相关的。
使用 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
,使用这些解析器,需要首先安装同名的第三方库。
获取页面的标题,可以看到其与浏览器中显示的一致:
查找页面中的所有 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
。
转载自:https://juejin.cn/post/7128561132532400142