分析 HTML 页面数据
我们可以使用 API 获取服务商提供数据的方法,这种方法获取到的数据非常干净,结构清晰。但在大多数情况下,各类网站为了保护自己的数据不轻易被别人获取,一般都不会轻易提供 API。而在这种情况下,我们拿到网页数据的常用方法就是直接解析页面数据。
网页是一个适用于万维网和网页浏览器的文件,它存放在世界某个角落的某一部或一组计算机中,而这部计算机必须是与互联网相连。网页经由网址(URL)来识别与访问,当我们在网页浏览器输入网址后,经过一段复杂而又快速的程序,网页文件会被传送到用户家的计算机,然后再通过浏览器解释网页的内容,再展示给用户。通常情况下,网络页面都是 HTML 格式。
HTML,又称超文本标记语言(英语:HyperText Markup Language)是一种用于创建网页的标准标记语言。HTML 是一种基础技术,常与 CSS、JavaScript 一起被众多网站用于设计令人赏心悦目的网页、网页应用程序以及移动应用程序的用户界面。网页浏览器可以读取 HTML 文件,并将其渲染成可视化网页。HTML 描述了一个网站的结构语义随着线索的呈现,使之成为一种标记语言而非编程语言。
所以说,凡是展示在页面上的内容,就会存在与网页的 HTML 文件中(不严谨)。通常情况下,你可以鼠标右键将当前页面保存为一个 HTML 文件。
HTML界面与xpath
XPath (XML Path Language) 是一门路径提取语言,最初被设计用来从 XML 文档中提取部分信息,现在它的这套提取方法也可以用于 HTML 文档上。下面我们通过一个例子来看看这些规则的用法。
假设有下面这样一份 HTML 文档,它列出了一些世界知名的 IT 公司及其相关信息。
<!DOCTYPE html>
<html>
<head>
<title>xpath</title>
</head>
<body>
<div class="companies">
<div class="company">
<h2>阿里巴巴</h2>
<a href="alibaba.com"><img src="alibaba.jpg"></a>
<p class="location">杭州</p>
</div>
<div class="company">
<h2>腾讯</h2>
<a href="qq.com"><img src="qq.jpg"></a>
<p class="location">深圳</p>
</div>
<div class="company">
<h2>Facebook</h2>
<a href="facebook.com"><img src="facebook.jpg"></a>
<p class="location">硅谷</p>
</div>
<div class="company">
<h2>微软</h2>
<a href="microsoft.com"><img src="microsoft.jpg"></a>
<p class="location">西雅图</p>
</div>
</div>
</body>
</html>
在使用 XPath 前,大家首先要把几个概念弄明白。首先是 节点(node)
,以上面的 HTML 文档为例子,每个标签都是一个节点,比如:
<div class="company">
<h2>腾讯</h2>
<img src="tencent.jpg">
<p class="location">深圳</p>
</div>
<div class="companies">
<div class="company">
<h2>阿里巴巴</h2>
<a href="alibaba.com"><img src="alibaba.jpg"></a>
<p class="location">杭州</p>
</div>
#可以看到都是这样子组成的
我们以蓝桥官网为例子,我直接用自己看资料的地方了
import requests
content = requests.get(url="https://www.lanqiao.cn/courses/") # 请求蓝桥云课课程页面
content
from lxml import etree
tree = etree.HTML(content.text) #etree.HTML()是lxml库中的一个函数,用于解析HTML字符串
paragraphs = tree.xpath('//div[@data-v-afd1ffbc]')#这个操作得到了所有div[@data-v-afd1ffbc]标签列表
print(paragraphs)
#这个代码中我们直接使用了xpath对网页进行解析
正式进入xpath
- 基本概念:
- 节点(Node): 文档中的主要构成单位,如元素节点、属性节点和文本节点,比如刚刚的HTML网页中的各种标签,xpath就是按照解析HTML的标签形式来的。
- 路径表达式(Path Expression): 用于选取 XML 文档中的节点或节点集的表达式,比如刚刚的腾讯可以写成 \body\div[‘@class=companies’]\div[‘@class=company’]。这个路径就是对应着那些公司的,你会发现每个公司都可以按照这个路径,按照这个路径可以得到一个结果的集合
<div class="company">
<h2>腾讯</h2>
<img src="tencent.jpg">
<p class="location">深圳</p>
</div>
- 常见的 XPath 表达式:
nodename
: 选取此节点的所有子节点。/
: 从根节点选取。//
: 从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置。.
: 选取当前节点。..
: 选取当前节点的父节点。@
: 选取属性。
- 选择节点:
- 选取指定节点:
/html/body/div
选取<html>
下的<body>
下的所有<div>
。 - 使用谓词:
/html/body/div[1]
选取<body>
下的第一个<div>
节点。 - 选取多个路径:
//div | //p
选取文档中所有<div>
和<p>
节点。
- 选取指定节点:
- 通配符:
*
: 匹配任何元素节点。@*
: 匹配任何属性节点。node()
:匹配任何类型的节点。
- 选取未知节点:
//div/*
: 选取所有属于<div>
的子元素的节点。//*
: 选取文档中所有元素。//title[@*]
: 选取所有带有任何属性的<title>
元素。
- XPath 函数:
text()
: 获取节点的文本内容,如//div/text()
。contains(@attr, 'string')
: 检查属性attr
是否包含字符串string
。starts-with(@attr, 'string')
: 检查属性attr
是否以字符串string
开头。
- 使用 XPath 的工具:
- 在 Python 中,可以使用
lxml
或BeautifulSoup
库结合 XPath 进行网页解析。 - 浏览器开发者工具中也常包含 XPath 选择器功能,便于测试和调试 XPath 表达式。
- 在 Python 中,可以使用
from lxml import etree
tree = etree.HTML(content.text) #etree.HTML()是lxml库中的一个函数,用于解析HTML字符串
paragraphs = tree.xpath('你的路径')#这个操作得到了所有路径下的标签列表,只要能按照这个路径就可以得到