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

Python爬虫--Xpath的应用

1.XPath 基本语法

在开始学习前,请遵守网站的robots协议。掌握这项技术能帮助我们高效获取资源,这些知识仅限个人学习使用。

XPath(XML Path Language)是一种在XML和HTML文档中定位节点的语言,常用于数据解析。以下是一些核心语法规则:

  • 节点选择

    • /:从根节点开始选取(绝对路径)。
    • //:从当前节点选择任意层级的子节点(相对路径)。
    • .:当前节点。
    • ..:父节点。
  • 属性选择

    • @:选择属性。例如://div[@class="content"] 选择所有class属性为"content"<div>
  • 谓语(条件筛选)

    • [n]:选择第n个节点(索引从1开始)。
    • [last()]:选择最后一个节点。
    • [contains(@attr, "value")]:属性包含特定值。

2.常用表达式示例

  1. 文本提取

    • //p/text():获取所有<p>标签的文本内容。
    • //a/@href:获取所有<a>标签的href属性值。
  2. 层级嵌套

    • //div[@id="main"]//li:选择id="main"<div>下的所有<li>(任意层级)。
  3. 逻辑条件

    • //input[@type="text" and @name="user"]:选择type"text"name"user"<input>

3.高级用法

  • 轴(Axis)

    • ancestor:::选择所有祖先节点。
    • following-sibling:::选择后续同级节点。
    • 示例://td[text()="Price"]/following-sibling::td[1] 选择“Price”后的第一个<td>
  • 函数

    • normalize-space():去除文本多余空格。
    • starts-with(@attr, "prefix"):属性值以特定前缀开头。

4.实际应用场景

  • 爬虫数据提取

    • 定位动态生成的元素://div[contains(@class, "dynamic-content")]
    • 处理表格数据://table//tr[position()>1] 跳过表头行。
  • XML/JSON解析

    • 配合lxml库(Python)使用:
      from lxml import etree
      html = etree.HTML(response.text)
      result = html.xpath('//title/text()')
      

5.注意事项

  • 避免过度依赖绝对路径(如/html/body/div),结构变化易导致失效。
  • 优先使用containsstarts-with匹配部分属性值,提高容错性。
  • 浏览器开发者工具(如Chrome)可直接复制XPath路径,但需人工优化。

通过灵活组合上述语法,可以高效定位并提取结构化数据。



正文:

以上是人工智能的回答,以我不太清晰逻辑来表达我的流程体验及应用

2025.7.23 -20:12   

阔别已久,我经过查阅和寻找对我的性认知希望能够得到正确的纠正,我第一次接触到性,大概是在初二时,我看到别人看那样的场景,第一次觉得特别恶心,后面自己不懂,也有些其他的奇奇怪怪的想法,所以我应该有挺长的自慰史了,哈哈,我想把这个戒掉,起码在我进步的这段时间里,因为每次完事后,我伴随的是无尽的悔恨;所以下定决心了好多次,这个事,也难以启齿。同时经过我的了解网络上的概念:性缘脑,好像很符合我,我也想对自己做出改变;

正确的性教育对我来说很重要,是浏览不良网站的愧疚,所以我也查阅了相关的教育片,日本的“”17.3“”这部性教育片,在b站上有,我看了有了体验,也学习到了知识。讲的是三位女性对于性的不同认知,三个角度,但她们都相互帮忙,是很好的友谊。所以我更希望让自己正确认识性知识,面对它,自慰不可怕,但在少之又少的性教育来说,我在进行着这样教育的时候,和同学低头笑语,好像自己很懂,其实自己不懂,害羞、更为自己的行为可耻,受不良网站的侵扰,我不止一次下令痛改前非,所以这一次更像是对自己的告诫,加油,少年!

自重自尊自爱自愈

“没写错,我要正确的认识自己,我想在CSDN上发布的原因是,我想正确的认识自己,也想以此来约束自己,我喜欢过一个女孩子,她很漂亮,然后我也想通过自己的努力(我自卑)表白我的心意,是激励我前行的动力。但我是自卑的,我害怕但我要勇敢的面对自己。”

2025.7-20:32

一、进入正题

首先,我们需要先安装一个插件来辅助我们解析Xpath,这是安装的方法,推荐使用谷歌浏览器,用极简插件来安装,这是它的一个安装完成的插件图标,因为在CSDN上已存在资源,我无法直接上传安装包。可自行查阅网络资源下载,或着给我发消息。



我将进行一步实例展示其应用

二、查看页面源代码

  1. 该网站通常是静态的,特别适合使用Xpath提取新闻类和小说类内容。

  2. 图片展示

  3. 判断网站是静态还是动态的方法

  4. 这个呢,我有时也不理解,静态网站:由纯 HTML、CSS 构成,内容固定,除非手动修改代码。

  5. 动态网站:使用 JavaScript 和/或服务器端技术,内容可根据条件或用户输入变化;通常需要与数据库交互,无需服务器端处理;可以截图网页源代码利用AI问问。AI回答

  6. --------------------------------------------------------------------------------------------------

  7. 一、观察URL结构特征

  8. 静态网站URL特征

    • 通常包含文件扩展名(如.html、.htm、.css、.js等)
    • 示例:www.example.com/about.html
    • URL结构简单直观,反映文件目录结构
    • 参数较少或没有查询字符串
  9. 动态网站URL特征

    • 常包含问号(?)和参数(如?id=123&category=5)
    • 示例:www.example.com/product.php?id=123
    • 可能使用伪静态URL(如www.example.com/news/2023/10/15
    • 可能包含会话ID或其他标识符
  10. 静态页面特征

    • HTML代码中不包含服务器端脚本标签(如PHP、ASP、JSP等)
    • 内容在源代码中完全可见
    • 没有明显的动态生成标记
  11. 动态页面特征

    • 可能包含服务器端脚本标签(如<?php ... ?><% ... %>等)
    • 常见动态内容占位符
    • 可能包含模板引擎标记

---------------------------------------------------------------------------------------------------------------------

查看结果:

使用之前,介绍这个情景题要》

在使用XPath解析HTML文档之前,我们需要明确这个代码片段的具体应用场景和实现原理。这个示例展示了如何从网页响应中提取<title>标签的文本内容,是网络爬虫开发中常见的HTML解析场景。

具体实现步骤如下:

response.text:通常来自requests库的网络请求响应,包含网页的HTML源代码

etree.HTML():将HTML字符串转换为可解析的Element对象

xpath():使用XPath表达式定位目标元素

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

/text():提取元素的文本内容

from lxml import etree
html = etree.HTML(response.text)
result = html.xpath('//title/text()')

注释

为了多爬取字段,观察不同的xpath路径。来查看相关关联

这是小说类别的具体字段的xpath对应,对应下面的category

/html/body/div[5]/div/div[2]/div[1]/table/tbody/tr[2]/td[1]/p

category = html.xpath('/html/body/div[5]/div/div[2]/div[1]/table/tr[2]/td[1]/p/text()')
book_name = html.xpath('/html/body/div[5]/div/div[2]/div[1]/table/tr[2]/td[2]/p/a/text()')
latest_chapter = html.xpath('/html/body/div[5]/div/div[2]/div[1]/table/tr[2]/td[3]/p/a/text()')
author = html.xpath('/html/body/div[5]/div/div[2]/div[1]/table/tr[2]/td[4]/p/a/text()')
word_count = html.xpath('/html/body/div[5]/div/div[2]/div[1]/table/tr[2]/td[5]/p/text()')
update_date = html.xpath('/html/body/div[5]/div/div[2]/div[1]/table/tr[2]/td[6]/p/text()')

经过对比后,发现tbody删除,在后面加上了  "/text()"  提取文本内容

/html/body/div[5]/div/div[2]/div[1]/table/tbody/tr[2]/td[1]/p

1、category = html.xpath('/html/body/div[5]/div/div[2]/div[1]/table/tr[2]/td[1]/p/text()')

  • 该路径绝对定位,对网页结构变化非常敏感

相对路径:

2、category = html.xpath('//table//tr[2]/td[1]/p/text()')

  1. 第一个XPath路径: /html/body/div[5]/div/div[2]/div[1]/table/tr[2]/td[1]/p/text()
  • 是绝对的完整路径
  • 从html根节点开始层层往下定位
  • 每个层级都指定了具体的位置索引(如div[5])
  • 一旦网页结构中任意层级的元素位置/数量发生变化就会失效
  1. 第二个XPath路径: //table//tr[2]/td[1]/p/text()
  • 使用双斜杠//表示相对路径
  • 可以直接查找文档中任意位置的table元素
  • 避免了从根节点开始的冗长路径
  • 对网页结构变化的适应性更强(只要table的层级关系不变)
  • 仍保留了部分精确位置定位(如tr[2])

总结

有什么问题欢迎在评论区讨论,我积极改正。不断进步。

http://www.lryc.cn/news/597349.html

相关文章:

  • rust嵌入式开发零基础入门教程(五)
  • 使用阿里云 ESA 边缘函数转发代理 docker registry
  • OpenLayers 快速入门(十)常用 API 补充
  • 量化金融简介(附电子书资料)
  • 分布式系统中的缓存设计与应用
  • 三步实现Android系统级集成:预装Google TTS + 默认引擎设置 + 语音包预缓存方案
  • AI助力,轻松实现人声分离伴奏提取
  • 【金融机器学习】第五章:最优投资组合——Bryan Kelly, 修大成(中文翻译)
  • 手机开启16k Page Size
  • 大模型【进阶】(四)QWen模型架构的解读
  • SpringBoot07-数据层的解决方案:SQL
  • FireFox一些设置
  • latex中既控制列内容位置又控制列宽,使用>{\centering\arraybackslash}p{0.85cm}
  • OpenLayers 快速入门(二)Layer 对象
  • 深入掌握 Python 面向对象的灵魂——魔法函数(Magic / Dunder Methods)全景指南
  • CAN的终端电阻
  • 设计模式代码总结
  • 用 PyTorch 实现全连接网络识别 MNIST 手写数字
  • Android插件化实现方案深度分析
  • window下c++共享内存,进程互斥锁。
  • macOS配置maven及报错处理:zsh: permission denied: mvn
  • 大厂总结常用分析问题方法之CMMI-IDEAL模型
  • VRRP技术-设备备份技术
  • Modbus TCP转Devicenet:水泥厂PLC与多类仪表的自动化通信实践
  • 学习 Flutter(五):玩安卓项目实战 - 下
  • 2025年7月一区SCI-投影迭代优化算法Projection Iterative Methods-附Matlab免费代码
  • Flutter学习笔记(四)---基础Widget
  • 如何解决pip安装报错ModuleNotFoundError: No module named ‘jupyter’问题
  • OSPF路由协议——上
  • 2025.7.15vlan作业