当前位置: 首页 > article >正文

爬虫XPath相关

朋友问我有关爬虫代码中xpath的相关问题,没系统学过Python,小学了一下做了一些整理,如有错误欢迎交流!

例3.5

她问我的问题是,横线划出来的地方是怎么得来的?(好问题!)

首先,对于这里的'//span[@class="appellation"]',它实际上是通过查看页面的源代码(HTML结构)得来的。是你想要获取网页内的某些信息,然后通过查看源代码后编写相应XPath表达式从而获取它。

这是网页爬取中常用的一个步骤。以下是具体的过程:

1. 查看页面源代码

在浏览器中查看网页的HTML源代码来确定目标数据的结构和特征。具体步骤如下:

步骤 1:打开目标网页

在浏览器中访问目标网页(代码中给出的URL)。

是这样的。

步骤 2:查看网页源代码

在网页上右键,然后选择查看页面源代码。过程如下:

点击后就会跳转到页面源代码。

步骤 3:找到目标信息

在源码中往下翻,比如你想获取这篇文章的来源和作者,在代码中它是上面这张图中的样子。

2. 确定信息的HTML特征

通过分析HTML结构,可以发现:

来源和作者都在<span>标签中。

这些<span>标签都带有class="appellation"属性。

从而:

要提取来源和作者,我们需要找出所有<span>标签,且其class属性为"appellation"。

3. 编写XPath表达式

根据HTML结构,设计对应的XPath表达式来定位目标信息。

XPath的生成逻辑如下:

//span: 查找所有的<span>标签。

[@class="appellation"]: 筛选出class属性值为"appellation"的<span>标签。

组合在一起://span[@class="appellation"]

上面这段XPath表达式会匹配到两段<span>标签,分别是:

<span class="appellation">来源:《求是》2019/01</span>

<span class="appellation">作者:黄坤明</span>

然后,details就 = [

    "来源:《求是》2019/01",

    "作者:黄坤明"

]

details[0].text:获取第一段文本内容,即 "来源:《求是》2019/01";

details[1].text:获取第二段文本内容,即 "作者:黄坤明"。

最后打印输出结果就是:

来源:《求是》2019/01

作者:黄坤明

3.6

跟前一个例子的步骤一样我们打开这个网页以及它的源代码,现在我们想要获取网页上所有书的书名。

分步解析 //ul[@id="div"]/li/a/@title

//ul:查找文档中所有<ul>标签。

[@id="div"]:筛选出id属性等于"div"的<ul>标签。即定位到下面这种结构:

在页面源代码中即这里:

/li:从<ul>标签中查找直接子节点<li>,每个<li>对应一条书籍信息。

/a:查找<li>中的<a>标签。这个<a>是链接标签,包含书籍标题和链接地址。

/@title:提取<a>标签的title属性内容。title属性里就是我们想要的书名。

最终匹配得到的titles数组就是下面这样的。

[

    "【书评】早面积累优势区域开放放大的上扬保障",

    "从服务生产力中审视中国产业结构转型路径",

    ...

]

最终的输出就是所有书名:

【书评】早面积累优势区域开放放大的上扬保障

从服务生产力中审视中国产业结构转型路径

...

扩充

你可能还会想问:

刚刚的//span[@class="appellation"]和现在的//ul[@id="div"]/li/a/@title,它们的格式是怎么样的,怎么一会有两个/一会只有一个/,一会是/一会是中括号[],还有@,这些都是什么?

下面有一个总表可以看一下:

比如 /(单斜杠)表示从当前节点开始,查找直接子节点。

例如 /html/body/ul表示查找html下的body,再查找body的直接子节点ul。

//(双斜杠)表示从当前节点开始,查找所有后代节点(不限层级)。

例如 //ul表示从文档的任意位置开始,查找所有的<ul>标签。

中括号[]用于筛选节点,指定某些条件或属性值。

例如 //ul表示查找所有<ul>标签。而 //ul[@id="div"]表示只查找id属性等于"div"的<ul>标签。

@用于访问节点的属性。

例如 //a表示查找所有<a>标签。而 //a/@href表示查找所有<a>标签的href属性值。


http://www.kler.cn/a/417055.html

相关文章:

  • Python基础学习-13模块的介绍
  • 【每天一篇深度学习论文】(IEEE 2024)即插即用特征增强模块FEM
  • 行驶证 OCR 识别API接口的影响因素
  • Linux的文件系统
  • 当测试时间与测试资源有限时,你会如何优化测试策略?
  • 飞塔防火墙只允许国内IP访问
  • Android笔记(三十四):封装带省略号图标结尾的TextView
  • 电机瞬态分析基础(6):坐标变换(续)
  • 从0到1搭建webpack
  • ESLint 配置文件全解析:格式、层叠与扩展(3)
  • 将大模型指令微调数据从parquet转为json格式
  • 大数据新视界 -- Hive 与其他大数据工具的集成:协同作战的优势(上)(13/ 30)
  • Flink随笔 20241129 流数据处理:以生产线烤鸡为例理解 Flink
  • Socket编程(TCP/UDP详解)
  • Windows 平台使用 podofo.dll 异常,需要安装一下库:Win64OpenSSL_Light-3_3_2.msi
  • 配置泛微e9后端开发环境
  • 学习C#中的反射
  • 【Yarn Bug】 yarn 安装依赖出现的网络连接问题
  • Java抛出自定义运行运行
  • 后端-mybatis的一对一查询
  • 准确--在 AlmaLinux 9.2 上快速搭建 FTP 服务器
  • AI潮汐日报1128期:马斯克计划推出Grok挑战GPT宝座、实时数字孪生心脏模拟、大模型竟也会产生焦虑和偏见
  • SpringBoot 架构的新冠密接者跟踪系统:安全防护体系深度解读
  • 学习ASP.NET Core的身份认证(基于Session的身份认证3)
  • Next.js 中 API 路由与 Actions 的使用选择与比较
  • linux centos nginx编译安装