
本文介绍如何通过组合 xpath 表达式,一次性匹配两种不同 class 布局的 html 元素,精准提取运费文本,避免重复解析逻辑,提升爬虫鲁棒性。
本文介绍如何通过组合 xpath 表达式,一次性匹配两种不同 class 布局的 html 元素,精准提取运费文本,避免重复解析逻辑,提升爬虫鲁棒性。
在网页数据抓取实践中,目标字段(如“运费”)常因网站 A/B 版本、前端重构或多模板渲染而存在于结构迥异的 DOM 节点中。例如,你遇到的两类页面:
- 类型一:运费位于 内部的第二个子中;
- 类型二:运费位于
内部的 标签内。若分别维护两套 XPath 并依次尝试,代码冗余且可读性差。更优雅的方案是使用 XPath 的联合选择(Union Operator |),将多个路径合并为一个表达式,由解析器自动返回首个匹配结果。
✅ 推荐的统一 XPath 表达式如下:
(//*[@class="flex flex-row justify-between f6 mid-gray pt2"]/div[@class="green"] | //*[@class="mid-gray flex items-center"]/span)[1]/text()
? 关键解析:
htmlppt.skill下载把任意文章或文档内容转换成精美的全屏翻页 HTML 演示文件(幻灯片风格)。当用户发来一篇文章、文档链接、Markdown 内容、或粘贴的文本,并且希望生成演示用的 HTML 时触发。支持任意内容来源:iWiki 链接、KM 链接、本地文件路径、直接粘贴的文本。生成的 HTML 文件保存到本地工作区,并通过企微直接发送给用户。触发词示例:帮我把这篇文章做成PPT、转成演示文档、生成HTML幻灯片、做个演示、转成可以演示的格式、article to deck、make a slide。
- (... | ...):XPath 中的 union 操作符,用于合并两个节点集(注意:仅支持同级节点集合并,不支持嵌套 |);
- [1]:作用于整个联合结果集,取第一个有效匹配项(即优先命中类型一,若无则回退至类型二),确保返回唯一值;
- /div[@class="green"]:比原始问题中的 //div[2] 更健壮——它基于语义 class 精准定位(而非脆弱的序号索引),避免因 DOM 顺序微调导致提取失败;
- /text():严格提取纯文本内容,排除子标签干扰。
⚠️ 注意事项:
- | 运算符返回的是去重后的节点集合,但顺序取决于文档中实际出现位置(非表达式书写顺序)。因此 [1] 保证的是“文档中第一个被匹配到的节点”,而非“第一个 XPath 子表达式”。若需强制优先级(如必须先试路径A),建议仍采用 try/except 或 or 逻辑控制流(尤其在 lxml 或 Scrapy 中);
- 若目标元素存在多个同类节点(如页面含多处运费),应结合上下文过滤(如父容器 ID、附近关键词等),避免误取;
- 建议配合 normalize-space() 函数清理首尾空白与换行:
(//*[@class="flex flex-row justify-between f6 mid-gray pt2"]/div[@class="green"] | //*[@class="mid-gray flex items-center"]/span)[1]/normalize-space(text())
? 进阶提示:
对于更复杂的多结构适配场景,可考虑:- 使用 CSS 选择器 + 多路径 fallback(如 response.css('.green::text, .items-center span::text').get());
- 在解析层封装智能提取函数,内置正则校验(如 r'¥?\d+\.?\d*' 匹配金额)进一步增强容错能力。
统一 XPath 不仅简化代码,更体现了“面向变化编程”的工程思维——用声明式表达替代过程式判断,让数据提取更简洁、可维护、可测试。
- 类型二:运费位于
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










