跳到内容

如何在 XPath 中按类选择元素:终极指南

如果您希望从网站中提取数据,您很可能需要根据其类别选择特定元素。类是 HTML 中对元素进行分类和设置样式的基本方法。幸运的是,XPath 提供了通过类属性选择元素的强大方法。

在本深入指南中,我们将详细介绍如何使用 XPath 按类选择元素。无论您是初学者还是经验丰富的网络抓取工具,在本文结束时,您都将能够熟练地浏览 HTML 文档并精确定位所需的元素。让我们开始吧!

XPath 快速回顾

在深入研究类选择器之前,让我们简要回顾一下 XPath 是什么以及它是如何工作的。 XPath 是一种查询语言,用于导航和选择 XML 或 HTML 文档中的节点。它允许您编写表达式,根据标签名称、属性、位置等来精确定位特定元素。

以下是有关 XPath 需要了解的一些关键事项:

  • XPath 将文档视为树结构,具有根节点和从其分支的子节点
  • 表达式从左到右求值
  • 正斜杠 (/) 用于在节点之间导航
  • 可以根据元素的名称来选择元素(例如 //div 全选 <div> 元素)
  • 方括号中的谓词允许更精确的选择(例如 //div[@id=‘main‘] 选择 <div> id 为“main”的元素)

有了这个基础,让我们将注意力转向类以及如何在 XPath 表达式中利用它们。

了解 HTML 类

类是一种 HTML 属性,允许您为元素分配一个或多个类名。它们主要用于 CSS 样式设计,但对于网页抓取时定位特定元素也非常有用。

以下是具有两个类的段落元素的示例:

<p class="highlight text-center">This is some text.</p>

在这种情况下, <p> 元素应用了两个类:“highlight”和“text-center”。一个元素可以有任意数量的类,这些类在类属性值中用空格分隔。

要记住的一件事是类名称区分大小写。所以 class="highlight"class="Highlight" 将被视为两个不同的类别。

现在我们了解了 HTML 类是什么,让我们看看如何使用 XPath 根据元素的类来选择元素。

在 XPath 中按类选择元素

XPath 提供了两种通过类属性选择元素的主要方法:

  1. 使用 contains() 函数
  2. 类名精确匹配

让我们更深入地探讨每种方法。

方法 1:使用 contains() 函数

contains() 函数允许您选择其类属性的元素 包含 一个特定的类名。这是基本语法:

//element[contains(@class,‘classname‘)]

例如,选择所有 <div> 具有“容器”类的元素,您可以使用:

//div[contains(@class,‘container‘)]  

contains() 函数有几个关键特征:

  • 它区分大小写(因此“container”和“Container”将被视为不同)
  • 类名可以出现在类属性值的任意位置
  • 该元素还可以应用其他类,只要它包含指定的类即可

So contains(@class,‘container‘) 将匹配如下元素:

<div class="container"></div>
<div class="wrapper container card"></div>
<div class="container highlighted"></div>

但它会 不能 匹配:

<div class="containery"></div>
<div class="wrapper"></div>

contains() 方法是通用的,当您想要匹配具有特定类作为一部分的元素时,这可能是一个不错的选择。 类。但如果您需要更精确,下一种方法可能更可取。

方法2:类名精确匹配

选择具有以下类属性的元素 究竟 匹配特定值,可以使用以下语法:

//element[@class=‘classname‘]

例如,要选择 <p> 类恰好是“突出显示”的元素,您可以使用:

//p[@class=‘highlight‘]

该表达式将匹配:

<p class="highlight"></p>  

但不是:

<p class="highlight text-center"></p>
<p class="highlights"></p>
<p class="Highlight"></p>

正如您所看到的,精确匹配方法更加严格。类属性必须包含 仅由 指定的类名以便匹配。不能存在其他类,并且大小写必须完全匹配。

当您需要非常精确地选择元素,并且希望避免意外匹配恰好包含该类作为较大集合的一部分的元素时,此方法非常有用。

XPath 和类 – 关键考虑因素

当使用 XPath 按类选择元素时,需要记住一些重要的事情:

  • 类名区分大小写。 如前所述,“highlight”和“Highlight”被视为不同的类名。确保您的 XPath 表达式与大小写完全匹配。

  • 元素可以有多个类。 元素应用多个类并用空格分隔是很常见的。这 contains() 只要元素包含指定的类,该方法就会匹配元素 某处 在他们的类属性中。

  • 精确匹配更精确,但灵活性较差。 如果你使用 [@class=‘classname‘],类属性必须 仅由 包含该类。如果应用了其他类,则该元素将不会匹配。相比之下, contains(@class,‘classname‘) 只要类出现在属性值中的某个位置,就会匹配。

  • 大多数网络抓取工具和库都支持 XPath。 无论您使用的是带有 BeautifulSoup 或 Scrapy 的 Python、带有 Puppeteer 或 Cheerio 的 JavaScript,还是其他语言/框架,您都可能能够使用 XPath 表达式来提取数据。类选择的语法保持不变。

  • 性能对于大规模抓取很重要。 虽然 XPath 非常强大,但它也可能比 CSS 选择器等其他方法慢,尤其是对于更复杂的表达式。如果您要抓取大量页面,则值得对不同的方法进行基准测试,看看哪种方法能产生最佳性能。

班级选择器最佳实践和技巧

要充分利用 XPath 类选择器,请考虑以下最佳实践和提示:

  • 使用最简单的表达方式来完成工作。 有时一个简单的 //element[@class=‘classname‘] 是你所需要的全部。避免不必要的复杂性。

  • 需要时将类选择器与其他标准结合起来。 您可以使用谓词根据多个属性来选择元素(例如 //button[@class=‘primary‘ and @type=‘submit‘]),或者将类选择器与位置选择器结合起来(例如 (//div[@class=‘row‘])[2] 选择第二行)。

  • 请注意网站 HTML 的更改。 类通常用于样式目的,这意味着它们可能比 ID 等其他属性更频繁地更改。如果您的抓取工具损坏,请仔细检查您所定位的类是否仍然存在于页面上。

  • 使用相对 XPath 以避免重复长表达式。 如果您已经选择了父元素,则可以使用点 (.) 选择相对于该元素的子元素,例如 //div[@class=‘container‘]/./p.

  • 对于特定用例,请考虑其他方法,例如 CSS 选择器或正则表达式。 虽然 XPath 用途广泛,但有时另一种方法可能更简单或更快。 CSS 选择器性能卓越,非常适合基本的选择任务。正则表达式对于模式匹配或从文本内容中提取数据非常有用。

班级选择示例

让我们看一下使用 Python 进行类选择的一些示例以及 lxml 图书馆。

假设我们有这样的 HTML:

<html>
    <body>
        <div class="container">
            <p class="highlight">Paragraph 1</p>
            <p>Paragraph 2</p>
            <p class="highlight">Paragraph 3</p>
        </div>
    </body>  
</html>

全选 <p> 具有“highlight”类的元素,我们可以使用 contains():

from lxml import html

tree = html.fromstring(html_string)
highlighted_paragraphs = tree.xpath(‘//p[contains(@class,"highlight")]‘)

for paragraph in highlighted_paragraphs:
    print(paragraph.text)

# Output: 
# Paragraph 1
# Paragraph 3

如果我们只想选择 <p> 类所在的元素 究竟 “突出显示”,我们将使用:

exact_match_paragraphs = tree.xpath(‘//p[@class="highlight"]‘)

选择 <div> 元素,然后找到 <p> 内部带有“highlight”类的元素,我们可以使用相对 XPath:

div = tree.xpath(‘//div[@class="container"]‘)[0]
highlighted_paragraphs = div.xpath(‘./p[contains(@class,"highlight")]‘)

将它一起

在本指南中,我们深入了解了如何使用 XPath 按类选择元素。我们已经介绍了两种主要方法——使用 contains() 函数和精确的类名匹配——以及关键考虑因素、最佳实践和示例。

总结如下:

  • XPath 是一种强大的查询语言,用于选择 HTML/XML 文档中的元素
  • 类是一种为元素分配类别的方法,通常用于样式或选择目的
  • contains(@class,‘classname‘) 方法选择包含指定类作为其类属性值一部分的元素
  • [@class=‘classname‘] 方法选择类属性与指定类完全匹配的元素
  • XPath 类选择器区分大小写,并且可以与其他条件或相对选择器组合
  • 选择能够实现您的目标的最简单的表达方式并注意网站 HTML 随着时间的推移而发生的变化非常重要

有了这些知识,您就可以使用 XPath 和类选择器应对各种 Web 抓取挑战。无论您是初学者还是经验丰富的专业人士,了解如何精确定位所需的元素都是一项基本技能。

当您将这些技术付诸实践时,请记住始终尊重网站所有者并遵守任何适用的服务条款或 robots.txt 文件。快乐刮擦!

加入谈话

您的电邮地址不会被公开。 必填带 *